关于MongoDB数据库的总结
既然要說MongoDB數據庫,先引入NoSQL的概念。
NoSQL:
NoSQL,指的是非關系型的數據庫。NoSQL有時也稱作Not Only SQL的縮寫,是對不同于傳統的關系型數據庫的數據庫管理系統的統稱。
NoSQL用于超大規模數據的存儲。(例如谷歌或Facebook每天為他們的用戶收集萬億比特的數據)。這些類型的數據存儲不需要固定的模式,無需多余操作就可以橫向擴展。
為什么使用NoSQL ?
今天我們可以通過第三方平臺(如:Google,Facebook等)可以很容易的訪問和抓取數據。用戶的個人信息,社交網絡,地理位置,用戶生成的數據和用戶操作日志已經成倍的增加。我們如果要對這些用戶數據進行挖掘,那SQL數據庫已經不適合這些應用了, NoSQL數據庫的發展也卻能很好的處理這些大的數據。
什么是MongoDB ?
- MongoDB 是由C++語言編寫的,是一個基于分布式文件存儲的開源數據庫系統。
- 在高負載的情況下,添加更多的節點,可以保證服務器性能。
- MongoDB 旨在為WEB應用提供可擴展的高性能數據存儲解決方案。
- MongoDB 將數據存儲為一個文檔,數據結構由鍵值(key=>value)對組成。MongoDB 文檔類似于 JSON 對象。字段值可以包含其他文檔,數組及文檔數組。
主要特點:
- MongoDB 是一個面向文檔存儲的數據庫,操作起來比較簡單和容易。
- 你可以在MongoDB記錄中設置任何屬性的索引 (如:FirstName="Sameer",Address="8 Gandhi Road")來實現更快的排序。
- 你可以通過本地或者網絡創建數據鏡像,這使得MongoDB有更強的擴展性。
- 如果負載的增加(需要更多的存儲空間和更強的處理能力) ,它可以分布在計算機網絡中的其他節點上這就是所謂的分片。
- Mongo支持豐富的查詢表達式。查詢指令使用JSON形式的標記,可輕易查詢文檔中內嵌的對象及數組。
- MongoDb 使用update()命令可以實現替換完成的文檔(數據)或者一些指定的數據字段 。
- Mongodb中的Map/reduce主要是用來對數據進行批量處理和聚合操作。
- Map和Reduce。Map函數調用emit(key,value)遍歷集合中所有的記錄,將key與value傳給Reduce函數進行處理。Map函數和Reduce函數是使用Javascript編寫的,并可以通過db.runCommand或mapreduce命令來執行MapReduce操作。
- GridFS是MongoDB中的一個內置功能,可以用于存放大量小文件。
- MongoDB允許在服務端執行腳本,可以用Javascript編寫某個函數,直接在服務端執行,也可以把函數的定義存儲在服務端,下次直接調用即可。
- MongoDB支持各種編程語言:RUBY,PYTHON,JAVA,C++,PHP,C#等多種語言。
- MongoDB安裝簡單。
語言支持
| Erlang | Haskell | java |
| JavaScript | Lisp | node.JS |
| Perl | PHP | Python |
| Ruby | Scala |
MongoDB 概念解析
不管我們學習什么數據庫都應該學習其中的基礎概念,在mongodb中基本的概念是文檔、集合、數據庫,下面我們挨個介紹。
- 下表將幫助您更容易理解Mongo中的一些概念:
| database | database | 數據庫 |
| table | collection | 數據庫表/集合 |
| row | document | 數據記錄行/文檔 |
| column | field | 數據字段/域 |
| index | index | 索引 |
| table joins | 表連接,MongoDB不支持 | |
| primary key | primary key | 主鍵,MongoDB自動將_id字段設置為主鍵 |
數據庫:
一個mongodb中可以建立多個數據庫。
MongoDB的默認數據庫為"db",該數據庫存儲在data目錄中。
MongoDB的單個實例可以容納多個獨立的數據庫,每一個都有自己的集合和權限,不同的數據庫也放置在不同的文件中。
"show dbs" 命令可以顯示所有數據的列表。
執行 "db" 命令可以顯示當前數據庫對象或集合。
運行"use"命令,可以連接到一個指定的數據庫。
數據庫也通過名字來標識。數據庫名可以是滿足以下條件的任意UTF-8字符串。
- 不能是空字符串("")。
- 不得含有' '(空格)、.、$、/、\和\0 (空字符)。
- 應全部小寫。
- 最多64字節。
有一些數據庫名是保留的,可以直接訪問這些有特殊作用的數據庫。
- admin: 從權限的角度來看,這是"root"數據庫。要是將一個用戶添加到這個數據庫,這個用戶自動繼承所有數據庫的權限。一些特定的服務器端命令也只能從這個數據庫運行,比如列出所有的數據庫或者關閉服務器。
- local: 這個數據永遠不會被復制,可以用來存儲限于本地單臺服務器的任意集合
- config: 當Mongo用于分片設置時,config數據庫在內部使用,用于保存分片的相關信息。
文檔:
文檔是一組鍵值(key-value)對(即BSON)。MongoDB 的文檔不需要設置相同的字段,并且相同的字段不需要相同的數據類型,這與關系型數據庫有很大的區別,也是 MongoDB 非常突出的特點。
{"url":"https://www.baidu.com", "name":"百度"}RDBMS 與 MongoDB 對應的術語:
RDBMS| MongoDB
-|-
數據庫| 數據庫
表格 |集合
行 |文檔
列 |字段
表聯合| 嵌入文檔
主鍵 |主鍵 (MongoDB 提供了 key 為 _id )
需要注意的是:
集合:
集合就是 MongoDB 文檔組,類似于 RDBMS (關系數據庫管理系統:Relational Database Management System)中的表格。
集合存在于數據庫中,集合沒有固定的結構,這意味著你在對集合可以插入不同格式和類型的數據,但通常情況下我們插入集合的數據都會有一定的關聯性。
{"site":"www.baidu.com"} {"site":"www.google.com","name":"Google"} {"site":"http://jikedaohang.com","name":"極客導航","num":5}- 當第一個文檔插入時,集合就會被創建。
合法的集合名
- 集合名不能是空字符串""。
- 集合名不能含有\0字符(空字符),這個字符表示集合名的結尾。
- 集合名不能以"system."開頭,這是為系統集合保留的前綴。
- 用戶創建的集合名字不能含有保留字符。有些驅動程序的確支持在集合名里面包含,這是因為某些系統生成的集合中包含該字符。除非你要訪問這種系統創建的集合,否則千萬不要在名字里出現$。
元數據:
數據庫的信息是存儲在集合中。它們使用了系統的命名空間:
dbname.system.*在MongoDB數據庫中名字空間 .system.* 是包含多種系統信息的特殊集合(Collection),如下:
| dbname.system.namespaces | 列出所有名字空間。 |
| dbname.system.indexes | 列出所有索引。 |
| dbname.system.profile | 包含數據庫概要(profile)信息。 |
| dbname.system.users | 列出所有可訪問數據庫的用戶。 |
| dbname.local.sources | 包含復制對端(slave)的服務器信息和狀態。 |
對于修改系統集合中的對象有如下限制:
- 在{{system.indexes}}插入數據,可以創建索引。但除此之外該表信息是不可變的(特殊的drop index命令將自動更新相關信息)。
- {{system.users}}是可修改的。 {{system.profile}}是可刪除的。
MongoDB 數據類型:
| String | 字符串。存儲數據常用的數據類型。在 MongoDB 中,UTF-8 編碼的字符串才是合法的。 |
| Integer | 整型數值。用于存儲數值。根據你所采用的服務器,可分為 32 位或 64 位。 |
| Boolean | 布爾值。用于存儲布爾值(真/假)。 |
| Double | 雙精度浮點值。用于存儲浮點值。 |
| Min/Max keys | 將一個值與 BSON(二進制的 JSON)元素的最低值和最高值相對比。 |
| Array | 用于將數組或列表或多個值存儲為一個鍵。 |
| Timestamp | 時間戳。記錄文檔修改或添加的具體時間。 |
| Object | 用于內嵌文檔。 |
| Null | 用于創建空值。 |
| Symbol | 符號。該數據類型基本上等同于字符串類型,但不同的是,它一般用于采用特殊符號類型的語言。 |
| Date | 日期時間。用 UNIX 時間格式來存儲當前日期或時間。你可以指定自己的日期時間:創建 Date 對象,傳入年月日信息。 |
| Object ID | 對象 ID。用于創建文檔的 ID。 |
| Binary Data | 二進制數據。用于存儲二進制數據。 |
| Code | 代碼類型。用于在文檔中存儲 JavaScript 代碼。 |
| Regular expression | 正則表達式類型。用于存儲正則表達式。 |
ObjectId
ObjectId 類似唯一主鍵,可以很快的去生成和排序,包含 12 bytes,含義是:
- 前 4 個字節表示創建 unix 時間戳,格林尼治時間 UTC 時間,比北京時間晚了 8 個小時
- 接下來的 3 個字節是機器標識碼
- 緊接的兩個字節由進程 id 組成 PID
- 最后三個字節是隨機數
MongoDB 創建數據庫:
use DATABASE_NAME- 如果數據庫不存在,則創建數據庫,否則切換到指定數據庫。
MongoDB 中默認的數據庫為 test,如果你沒有創建新的數據庫,集合將存放在 test 數據庫中。
注意: 在 MongoDB 中,集合只有在內容插入后才會創建! 就是說,創建集合(數據表)后要再插入一個文檔(記錄),集合才會真正創建。
MongoDB 刪除數據庫:
db.dropDatabase()- 刪除當前數據庫,默認為 test,你可以使用 db 命令查看當前數據庫名。
MongoDB 創建集合:
db.createCollection(name, options)參數說明:
- name: 要創建的集合名稱
- options: 可選參數, 指定有關內存大小及索引的選項
options 可以是如下參數:
| capped | 布爾 | (可選)如果為 true,則創建固定集合。固定集合是指有著固定大小的集合,當達到最大值時,它會自動覆蓋最早的文檔。當該值為 true 時,必須指定 size 參數。 |
| autoIndexId | 布爾 | (可選)如為 true,自動在 _id 字段創建索引。默認為 false。 |
| size | 數值 | (可選)為固定集合指定一個最大值(以字節計)。如果 capped 為 true,也需要指定該字段。 |
| max | 數值 | (可選)指定固定集合中包含文檔的最大數量。 |
在插入文檔時,MongoDB 首先檢查固定集合的 size 字段,然后檢查 max 字段。
在 test 數據庫中創建 runoob 集合:
> use test switched to db test > db.createCollection("runoob") { "ok" : 1 }如果要查看已有集合,可以使用 show collections 命令:
> show collections runoob system.indexesMongoDB 刪除集合:
db.collection.drop()MongoDB 插入文檔:
MongoDB 使用 insert() 或 save() 方法向集合中插入文檔,語法如下:
db.COLLECTION_NAME.insert(document) db.col.insert({'title': '斯巴達克斯1','actors': '未知','type': '動作','簡介': '古羅馬傳記'})MongoDB 更新文檔:
- MongoDB 使用 update() 和 save() 方法來更新集合中的文檔。
update() 方法用于更新已存在的文檔。
我們在集合 col 中插入如下數據:
接著我們通過 update() 方法來更新標題(title):
>db.col.update({'title':'MongoDB 教程'},{$set:{'title':'MongoDB'}}) WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 }) # 輸出信息 > db.col.find().pretty() {"_id" : ObjectId("56064f89ade2f21f36b03136"),"title" : "MongoDB","description" : "MongoDB 是一個 Nosql 數據庫","url" : "http://www.runoob.com","tags" : ["mongodb","database","NoSQL"],"likes" : 100 } >- 以上語句只會修改第一條發現的文檔,如果你要修改多條相同的文檔,則需要設置 multi 參數為 true。
save() 方法通過傳入的文檔來替換已有文檔:
db.collection.save(<document>,{writeConcern: <document>} )MongoDB 刪除文檔:
MongoDB remove()函數是用來移除集合中的數據。
MongoDB數據更新可以使用update()函數。在執行remove()函數前先執行find()命令來判斷執行的條件是否正確,這是一個比較好的習慣。
MongoDB 查詢文檔:
MongoDB 查詢文檔使用 find() 方法。
find() 方法以非結構化的方式來顯示所有文檔。
db.collection.find(query, projection)如果你需要以易讀的方式來讀取數據,可以使用 pretty() 方法:
db.col.find().pretty()除了 find() 方法之外,還有一個 findOne() 方法,它只返回一個文檔。
MongoDB 與 RDBMS Where 語句比較
| 等于 | {:} | db.col.find({"by":"菜鳥教程"}).pretty() | where by = '菜鳥教程' |
| 小于 | {:{$lt:}} | db.col.find({"likes":{$lt:50}}).pretty() | where likes < 50 |
| 小于或等于 | {:{$lte:}} | db.col.find({"likes":{$lte:50}}).pretty() | where likes <= 50 |
| 大于 | {:{$gt:}} | db.col.find({"likes":{$gt:50}}).pretty() | where likes > 50 |
| 大于或等于 | {:{$gte:}} | db.col.find({"likes":{$gte:50}}).pretty() | where likes >= 50 |
| 不等于 | {:{$ne:}} | db.col.find({"likes":{$ne:50}}).pretty() | where likes != 50 |
MongoDB 條件操作符:
條件操作符用于比較兩個表達式并從mongoDB集合中獲取數據。
MongoDB中條件操作符有:
- (>) 大于 - $gt
- (<) 小于 - $lt
- (>=) 大于等于 - $gte
- (<= ) 小于等于 - $lte
MongoDB $type 操作符:
$type操作符是基于BSON類型來檢索集合中匹配的數據類型,并返回結果。
MongoDB 中可以使用的類型如下表所示:
| Double | 1 | 空 |
| String | 2 | 空 |
| Object | 3 | 空 |
| Array | 4 | 空 |
| Binary data | 5 | 空 |
| Undefined | 6 | 已廢棄。 |
| Object id | 7 | 空 |
| Boolean | 8 | 空 |
| Date | 9 | 空 |
| Null | 10 | 空 |
| Regular Expression | 11 | |
| JavaScript | 13 | 空 |
| Symbol | 14 | 空 |
| JavaScript (with scope) | 15 | |
| 32-bit integer | 16 | 空 |
| Timestamp | 17 | 空 |
| 64-bit integer | 18 | 空 |
| Min key | 255 | Query with -1. |
| Max key | 127 | 空 |
MongoDB Limit與Skip方法:
如果你需要在MongoDB中讀取指定數量的數據記錄,可以使用MongoDB的Limit方法,limit()方法接受一個數字參數,該參數指定從MongoDB中讀取的記錄條數。
>db.COLLECTION_NAME.find().limit(NUMBER)我們除了可以使用limit()方法來讀取指定數量的數據外,還可以使用skip()方法來跳過指定數量的數據,skip方法同樣接受一個數字參數作為跳過的記錄條數。
>db.COLLECTION_NAME.find().limit(NUMBER).skip(NUMBER)MongoDB sort() 方法:
在 MongoDB 中使用 sort() 方法對數據進行排序,sort() 方法可以通過參數指定排序的字段,并使用 1 和 -1 來指定排序的方式,其中 1 為升序排列,而 -1 是用于降序排列。
>db.COLLECTION_NAME.find().sort({KEY:1})ngjie
niu***gjie@163.com
skip(), limilt(), sort()三個放在一起執行的時候,執行的順序是先 sort(), 然后是 skip(),最后是顯示的 limit()。
MongoDB 索引
索引通常能夠極大的提高查詢的效率,如果沒有索引,MongoDB在讀取數據時必須掃描集合中的每個文件并選取那些符合查詢條件的記錄。
這種掃描全集合的查詢效率是非常低的,特別在處理大量的數據時,查詢可以要花費幾十秒甚至幾分鐘,這對網站的性能是非常致命的。
索引是特殊的數據結構,索引存儲在一個易于遍歷讀取的數據集合中,索引是對數據庫表中一列或多列的值進行排序的一種結構
>db.collection.createIndex(keys, options)在后臺創建索引: db.values.createIndex({open: 1, close: 1}, {background: true})1、查看集合索引
db.col.getIndexes()
2、查看集合索引大小
db.col.totalIndexSize()
3、刪除集合所有索引
db.col.dropIndexes()
4、刪除集合指定索引
db.col.dropIndex("索引名稱")
MongoDB 聚合:
MongoDB中聚合(aggregate)主要用于處理數據(諸如統計平均值,求和等),> 并返回計算后的數據結果。有點類似sql語句中的 count(*)。
aggregate() 方法
> db.mycol.aggregate([{$group : {_id : "$by_user", num_tutorial : {$sum : 1}}}])一些聚合的表達式:
| $sum | 計算總和。 | db.mycol.aggregate([{$group : {_id : "$by_user", num_tutorial : {$sum : "$likes"}}}]) |
| $avg | 計算平均值 | db.mycol.aggregate([{$group : {_id : "$by_user", num_tutorial : {$avg : "$likes"}}}]) |
| $min | 獲取集合中所有文檔對應值得最小值。 | db.mycol.aggregate([{$group : {_id : "$by_user", num_tutorial : {$min : "$likes"}}}]) |
| $max | 獲取集合中所有文檔對應值得最大值。 | db.mycol.aggregate([{$group : {_id : "$by_user", num_tutorial : {$max : "$likes"}}}]) |
| $push | 在結果文檔中插入值到一個數組中。 | db.mycol.aggregate([{$group : {_id : "$by_user", url : {$push: "$url"}}}]) |
| $addToSet | 在結果文檔中插入值到一個數組中,但不創建副本。 | db.mycol.aggregate([{$group : {_id : "$by_user", url : {$addToSet : "$url"}}}]) |
| $first | 根據資源文檔的排序獲取第一個文檔數據。 | db.mycol.aggregate([{$group : {_id : "$by_user", first_url : {$first : "$url"}}}]) |
| $last | 根據資源文檔的排序獲取最后一個文檔數據 | db.mycol.aggregate([{$group : {_id : "$by_user", last_url : {$last : "$url"}}}]) |
管道的概念
管道在Unix和Linux中一般用于將當前命令的輸出結果作為下一個命令的參數。
MongoDB的聚合管道將MongoDB文檔在一個管道處理完畢后將結果傳遞給下一個管道處理。管道操作是可以重復的。
表達式:處理輸入文檔并輸出。表達式是無狀態的,只能用于計算當前聚合管道的文檔,不能處理其它的文檔。
| $project: | 修改輸入文檔的結構。可以用來重命名、增加或刪除域,也可以用于創建計算結果以及嵌套文檔。 |
| $match: | 用于過濾數據,只輸出符合條件的文檔。$match使用MongoDB的標準查詢操作。 |
| $limit: | 用來限制MongoDB聚合管道返回的文檔數。 |
| $skip: | 在聚合管道中跳過指定數量的文檔,并返回余下的文檔。 |
| $unwind: | 將文檔中的某一個數組類型字段拆分成多條,每條包含數組中的一個值。 |
| $group: | 將集合中的文檔分組,可用于統計結果。 |
| $sort: | 將輸入文檔排序后輸出。 |
| $geoNear: | 輸出接近某一地理位置的有序文檔。 |
MongoDB 備份(mongodump)與恢復(mongorestore)
MongoDB數據備份
- 在Mongodb中我們使用mongodump命令來備份MongoDB數據。該命令可以導出所有數據到指定目錄中。
- -h:
MongDB所在服務器地址,例如:127.0.0.1,當然也可以指定端口號:127.0.0.1:27017
- -d:
需要備份的數據庫實例,例如:test
- -o:
備份的數據存放位置,例如:c:\data\dump,當然該目錄需要提前建立,在備份完成后,系統自動在dump目錄下建立一個test目錄,這個目錄里面存放該數據庫實例的備份數據。
MongoDB數據恢復
- mongodb使用 mongorestore 命令來恢復備份的數據。
- --host <:port>, -h <:port>:
MongoDB所在服務器地址,默認為: localhost:27017
- --db , -d :
需要恢復的數據庫實例,例如:test,當然這個名稱也可以和備份時候的不一樣,比如test2
- --drop:
恢復的時候,先刪除當前數據,然后恢復備份的數據。就是說,恢復后,備份后添加修改的數據都會被刪除,慎用哦!
- :
mongorestore 最后的一個參數,設置備份數據所在位置,例如:c:\data\dump\test。 你不能同時指定 和 --dir 選項,--dir也可以設置備份目錄。
- --dir:
指定備份的目錄 你不能同時指定 和 --dir 選項。
轉載于:https://www.cnblogs.com/lygiants/p/11080827.html
《新程序員》:云原生和全面數字化實踐50位技術專家共同創作,文字、視頻、音頻交互閱讀總結
以上是生活随笔為你收集整理的关于MongoDB数据库的总结的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: ObservableCollection
- 下一篇: Flink 异步IO访问外部数据(mys