一個基於分佈式文件存儲的數據庫,介於關係數據庫和非關係數據庫之間的產品,是非關係數據庫當中功能最豐富
MongoDB將數據存儲爲一個文檔,數據結構由鍵值(key-value)對組成,MongoDB文檔相似於JSON對象,字段值能夠包含其餘文檔,數組及文檔數組
html
點擊訪問連接git
因爲MongoDB數據庫在關係型和非關係型數據庫之間,其數據庫結構相似關係型數據庫
github
SQL術語/概念 MongoDB術語/概念 解釋/說明 database database 數據庫 table collection 數據庫表/集合 row document 數據記錄行/文檔 column field 數據字段/域 index index 索引 table joins 錶鏈接,MongoDB不支持 primary key primary key 主鍵,MongoDB自動將_id字段設置爲主鍵
RDBMS MongoDB 數據庫 數據庫 表格 集合 行 文檔 列 字段 表聯合 嵌入文檔 主鍵 主鍵 (MongoDB 提供了 key 爲 _id
mongodb://[username:password@]host1[:port1][,host2[:port2],...[,hostN[:portN]]][/[database][?options]]
web
1.mongodb:// 固定格式,必須制定 2.username:password@ 可選,鏈接到數據庫後會參數登陸這個數據庫 3.host1 必須指定一個host 4.portx 可選指定端口,不填默認27017 5./database 若是指定username:password@,鏈接並驗證登陸指定數據庫,若不指定,默認打開test數據庫 6.?options 鏈接選項,全部鏈接選項都是鍵值對name=value,鍵值對之間經過&或;隔開
mongodb中默認的數據庫爲test,若是沒有建立新的數據庫,集合將存放在test數據庫中
正則表達式
- use database_name - 若是數據庫不存在,則建立數據庫,不然切換到指定數據庫 - show dbs - 查看全部數據庫 - show tables - 查看某數據中的全部集合 - db.數據庫名.insert({'key':'value'}) - 剛建立的數據庫並不在數據庫列表中,插入數據才顯示
-db.dropDatabase() - 刪除當前數據庫,默認爲test - db.集合名.drop() - 刪除數據庫中的集合
- db.createCollection(name,options) 建立 - name:要建立的集合名稱 - options:可選參數,指定有關內存大小以及索引 - capped 布爾 - 若是爲 true,則建立固定集合。固定集合是指有着固定大小的集合,當達到最大值時,它會自動覆蓋最先的文檔。當該值爲 true 時,必須指定 size 參數。 - autoindeld 布爾 - 如爲 true,自動在 _id 字段建立索引。默認爲 false。 - size 數值 - 爲固定集合指定一個最大值(字節計) - max 數值 - 指定固定集合包含文檔的最大數量 - db.collection.drop() 刪除 - 成功刪除選定集合,則drop()方法返回true 不然返回false
文檔的數據結構和json基本同樣 全部存儲在集合中的數據都是BSON格式 BSON是一種類json的一種二進制形式的存儲格式
-mongodb 使用insert()或save()方法向集合中插入文檔 -insert() 當插入數據中 _id在文檔中存在則報錯 - save() 當插入數據中 _id存在則覆蓋原來文檔 -db.集合名.insert(document)
-更新文檔 db.集合名.update/save() -update( <query>, #查詢條件 <update>, #update的對象和一些更新的操做符(如$,$inc)等,也能夠理解爲sql update查詢內set後面 { upsert:<boolean>, #可選 若是不存在update的記錄,是否插入objNew,true爲插入,默認是false,不插入 multi:<boolean>, #可選 mongodb 默認是false,只更新找到的第一條記錄,若是這個參數爲true,就把按條件查出來多條記錄所有更新。 writeConcern:<document> #可選 拋出異常的級別 } ) - save( document>, #文檔數據 { writeConcern: <document> 可選,拋出異常 } ) - 刪除文檔 db.集合名.remove() 在文檔刪除前先經過find()命令判斷執行條件是否正確 - remove( <query>, #可選 刪除文檔的條件 <justOne> #可選 若是設爲 true 或 1,則只刪除一個文檔,若是不設置該參數,或使用默認值 false,則刪除全部匹配條件的文檔。 writeConcern: <document> (可選)拋出異常的級別 )
-find #查詢全部 - db.集合名稱.find() -findone() #查詢第一個 - db.集合名稱.findone() -pretty() #將結果格式化 - db.集合名稱.find().pretty()
操做 | 格式 | 範例 | RDBMS中的相似語句 |
---|---|---|---|
等於 | {<key>:<value>} |
db.col.find({"by":"菜鳥教程"}).pretty() | where by = '菜鳥教程' |
小於 | {<key>:{$lt:<value>}} |
db.col.find({"likes":{$lt:50}}).pretty() | where likes < 50 |
小於或等於 | {<key>:{$lte:<value>}} |
db.col.find({"likes":{$lte:50}}).pretty() | where likes <= 50 |
大於 | {<key>:{$gt:<value>}} |
db.col.find({"likes":{$gt:50}}).pretty() | where likes > 50 |
大於或等於 | {<key>:{$gte:<value>}} |
db.col.find({"likes":{$gte:50}}).pretty() | where likes >= 50 |
不等於 | {<key>:{$ne:<value>}} |
db.col.find({"likes":{$ne:50}}).pretty() | where likes != 50 |
- and - db.集合名稱.find({key1:value1,key2:value2}) - or - db.集合名稱.find( { $or: [ {key1: value1}, {key2:value2} ] } ).pretty()
-in - db.集合名.find( { $in:[範圍值] }
- / / - db.集合名.find( { <key>:/匹配字段/ } )
-使用 // 或 $regex 編寫正則表達式 -實例: db.集合名.find({stu:/^abc/}) db.集合名.find({stu:{$regex:"^abc"}}) -db.集合名.find( { <field>:{$regex:"pattern",$options:"<options>"} } ) -options可選項:能夠組合使用 -i 忽略大小寫 -m 多行匹配模式 -x 忽略非轉義的空白字符 -s 單行匹配模式
須要在MongoDB中讀取指定數量的數據記錄,可使用MongoDB的Limit方法, limit()方法
-limit() - db.集合名.find().limit(number) - 接受一個數字參數,該參數指定從MongoDB中讀取的記錄條數。 - skip() 默認參數爲0 - db.集合名.find().skip(number) - 跳過指定數量的數據,skip方法一樣接受一個數字參數做爲跳過的記錄條數。 -兩個方法能夠組合使用 - db.集合名.find().skip(num).limit(num) 或 db.集合名.find().limit(num).skip(num)
-sort() #排序 - db.集合名.find().sort({key:1}) - sort() 方法能夠經過參數指定排序的字段,並使用 1 和 -1 來指定排序的方式, - 其中 1 爲升序排列,而 -1 是用於降序排列。 - count() #統計個數 - db.集合名.find().count() 或 db.集合名.count({條件}) - distinct() #消除重複(對數據去重) - db.集合名.distinct(key,{條件})
-字符的顯示 -實例:db.stu.find({age:{$gt:18},{name:1,_id:0}}) - 設置爲1顯示,_id設置爲0不顯示
索引是特殊的數據結構,索引存儲在一個易於遍歷讀取的數據集合中,索引是對數據庫表中一列或多列的值進行排序的一種結構sql
-createIndex() #建立索引 - db.集合名.createIndex(keys,options) - Key 值爲你要建立的索引字段(一致多個key),1 爲指定按升序建立索引,-1 爲指定按降序建立索引 - ooptions參數參考地址:http://www.runoob.com/mongodb/mongodb-indexing.html -getIndexts() #查看當前集合全部索引 - db.集合名.getIndexs() - dropIndex() #刪除集合指定索引 - db.集合名.dropIndex("索引名") - dropIndexs() #刪除集合全部索引 - totalIndexSize() #查看集合索引大小 - db.集合名.totalIndexSize()
MongoDB中聚合(aggregate)主要用於處理數據(諸如統計平均值,求和等),並返回計算後的數據結果。有點相似sql語句中的 count(*)。mongodb
- aggregate() - db.集合名稱.aggregate(aggregate_opeation)
處理輸入文檔並輸出。表達式是無狀態的,只能用於計算當前聚合管道的文檔,不能處理其它的文檔。數據庫
表達式 | 描述 | 實例 |
---|---|---|
$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 | 輸出接近某一地理位置的有序文檔。 |
將集合中的文檔分組,可用於統計結果json
- 實例:求學生總人數,平均年齡 db.stu.aggregate( { _id:null, #其分組的依據是 _id:後面的字段 counter:{$sum:1}, avgage:{$avg:'$age'} #須要執行的字段須要添加 $ } )
修改輸入文檔的結構canvas
-實例:在$group 中的輸出結果 存在 _id ,可經過$project修改 db.stu.aggregate( {$group:{_id:'$gender',count:{$sum:1},avg_age:{$avg:'$age'}}}, {$project:{gender:'$_id',count:1,avg_age:1,_id:0}} #當_id設置爲0 ,其字段隱藏 )
用於過濾數據,只輸出符合條件的文檔,把結果交給下一管道,find()不能夠
-實例:選擇年齡大於20的學生,觀察男性和女性有多少人 db.stu.aggregate( { $match:{ age:{$gt:20} } }, { $group:{_id:"$gender",count:{$sum:1} } }, { $project:{ _id:0,gender:"$_id",count:1 } } )
將輸入文檔排序後輸出 -實例:查詢學生信息,按年齡升序 db.stu.aggregate( { $sort:{age:1} } )
在聚合管道中跳過指定數量的文檔,並返回餘下的文檔
-實例:跳過前兩個文檔 db.stu.aggreagate( { $limit:2 } )
將文檔中的某一個數組類型字段拆分紅多條,每條包含數組中的一個值。
-實例1: 添加實驗數據:db.t1.insert({_id:1,item:'t-shirt',size:['S','M','L']}) 執行: db.t1.aggregate( {$unwind:'$size'} ) 結果: {"_id":1,"item":"t-shirt","size":"S"}, {"_id":1,"item":"t-shirt","size":"S"}, {"_id":1,"item":"t-shirt","size":"S"} -實例2:保留某字段沒有對應拆分的集合,(即保留size爲null或爲空的文檔) db.t1.aggregate( { $unwind:{ path:'$size',preserveNullAandEmptyArrays:true } } )
複製的基本架構:由3臺服務器組成,一個三成員的複製集,由三個有數據,或者兩個有數據,一個做爲仲裁者
高數據量和吞吐量的數據庫應用會對單機的性能形成較大壓力,大的查詢量會將單機的CPU耗盡,大的數據量對單機的存儲壓力較大,最終會耗盡系統的內存而將壓力轉移到磁盤IO上。
解決方案:
垂直擴展:增長更多的CPU和存儲資源來擴展容量。 水平擴展:將數據集分佈在多個服務器上。水平擴展即分片。
組件 | 說明 |
---|---|
Config Server | 存儲集羣全部節點、分片數據路由信息。默認須要配置3個Config Server節點。 |
Mongos | 提供對外應用訪問,全部操做均經過mongos執行。通常有多個mongos節點。數據遷移和數據自動平衡。 |
Mongod | 存儲應用數據記錄。通常有多個Mongod節點,達到數據分片目的。 |
1. mongos :數據路由,和客戶端打交道的模塊。mongos自己沒有任何數據,他也不知道該怎麼處理這數據,去找config server 2. config server:全部存、取數據的方式,全部shard節點的信息,分片功能的一些配置信息。能夠理解爲真實數據的元數據。 3. shard:真正的數據存儲位置,以chunk爲單位存數據。
-mongodump -h dbhost -d dbname -o dbdirectory -h MongoDB所在服務器地址 例如:127.0.0.1:27017 -d 須要備份的數據庫實例 例如:test -o 備份的數據存放位置 例如:c:/data/dump -mongorestore -h <hostname><:port> -d dbname <path> -host<:port>,-h <:port> - MongoDB所在服務器地址,默認:localhost:27017 - db,-d: - 須要恢復的數據庫實例,例如:test - drop: - 恢復的時候,先刪除當前數據,而後恢復備份數據 - <path>: - mongorestore 最後的一個參數,設置備份數據所在位置,例如:c:\data\dump\test。 - 你不能同時指定 <path> 和 --dir 選項,--dir也能夠設置備份目錄。 - dir: - 指定備份的目錄 - 不能同時指定<path>和 --dir選項