MongoDB 是由C++語言編寫的,是一個基於分佈式文件存儲的開源數據庫系統。在高負載的狀況下,添加更多的節點,能夠保證服務器性能。MongoDB 旨在爲WEB應用提供可擴展的高性能數據存儲解決方案。MongoDB 將數據存儲爲一個文檔,數據結構由鍵值(key=>value)對組成。MongoDB 文檔相似於 JSON 對象。字段值能夠包含其餘文檔,數組及文檔數組。MongoDB 是一個基於分佈式文件存儲的數據庫。由 C++ 語言編寫。旨在爲 WEB 應用提供可擴展的高性能數據存儲解決方案。MongoDB 是一個介於關係數據庫和非關係數據庫之間的產品,是非關係數據庫當中功能最豐富,最像關係數據庫的。html
NoSQL,指的是非關係型的數據庫。NoSQL有時也稱做 "Not Only SQL" 的縮寫,是對不一樣於傳統的關係型數據庫的數據庫管理系統的統稱。正則表達式
NoSQL用於超大規模數據的存儲。(例如谷歌或Facebook天天爲他們的用戶收集萬億比特的數據)。這些類型的數據存儲不須要固定的模式,無需多餘操做就能夠橫向擴展。spring
今天咱們能夠經過第三方平臺(如:Google,Facebook等)能夠很容易的訪問和抓取數據。用戶的我的信息,社交網絡,地理位置,用戶生成的數據和用戶操做日誌已經成倍的增長。咱們若是要對這些用戶數據進行挖掘,那SQL數據庫已經不適合這些應用了, NoSQL 數據庫的發展卻能很好的處理這些大的數據。sql
高可擴展性mongodb
分佈式計算shell
低成本數據庫
架構的靈活性,半結構化數據express
沒有複雜的關係json
安裝教程: https://www.cnblogs.com/qzdd/p/12304163.htmlwindows
安裝版本:V4.2.0
在這裏記錄一下本身遇到的坑:
在第一次安裝的時候,沒有注意勾選上了安裝這個部分,結果安裝程序一直卡在那塊。最後又從新安裝了一次才解決了問題。mongoDB compass主要是MongoDB的一個圖形化界面,後期能夠單獨安裝。
以前MongoDB按照默認路徑裝到了C盤。後來由於C盤的空間有限,後來又卸載安裝在了E盤。以前在C盤安裝的時候,順風順水沒有出一點問題。可是在E盤安裝時,遇到了一些問題。在安裝程序還在進行的時候,忽然跳出來一個提示,顯示MongoDB服務沒法啓動。經過查找一些資料,知道了當系統啓動服務的時候須要得到管理員權限,當程序安裝在C盤的時候,安裝程序能夠直接得到較高的權限,可是安裝在其餘位置,就會由於安裝權限不足,致使服務沒法啓動。 這時點擊忽略,直接完成安裝,以後經過命令行獲取系統管理員權限後,手動啓動服務。
當程序安裝完成以後,就須要安裝windows服務了,MongoDB中已經爲咱們寫好了配置文件,經過這個配置文件,便可安裝windows服務。具體的命令是:mongod --config "E:\MongoDB\bin\mongod.cfg" --install
本想着,安裝服務而後啓動服務就能夠可使用了,可是這樣卻出現了問題:Unrecognized option:mp這就使人很是抓狂了,配置文件是官方提供的,它怎麼能說mp是無效的屬性呢?
無奈之下,硬着頭皮去官網上查找cfg文檔。最後把整個文檔都翻爛了,都沒找到mp屬性。最後我心想,既然你沒有這個屬性,我試着把它刪掉吧。在文檔中刪掉了這一行,ok問題解決。。。這簡直了,官方提供的配置文件,盡然出現這樣的問題,心累。。。
【注意】:使用MongoDB服務安裝命令,會自動建立日誌文件,但不會初始化數據庫。必須使用啓動window--MongoDB服務或使用mongod --dbpath D:\Program\MongoDB\data建立數據庫實例(生成數據庫文件)
這裏補充一下配置文件修改過程當中遇到的坑:
配置文件中不能使用Tab鍵進行縮進
屬性名與屬性值之間,必須用:空格進行鏈接,若是不添加空格,屬性將沒法識別
最後在記錄一下MongoDB服務相關的命令,以備不時之需:
刪除windows服務:sc delete MongoDB
啓動服務 :net start MongoDB
中止服務:net stop MongoDB
更新服務配置:mongod -f E:\MongoDB\bin\mongod.cfg—Ps:在更新服務配置的過程當中出現:Failed global initialization: FileNotOpen的報錯.根據他的提示,沒法打開日誌文件。出現這個問題的緣由是由於,日誌的地址沒有改動,舊日誌與新日誌之間權限出現了衝突。致使沒法更新。能夠嘗試刪除服務,從新建立來解決這個問題。
使用MongoDB中有一個很大的困惑,盡然不須要密碼就能夠登陸?那它的安全性如何保證呢?權限劃分又是如何進行呢?對比MySQL在安裝成功以後就會有個初始密碼,MongoDB是否是不安全呢?下面咱們就分析一下,這些問題:
經過上一個章節的操做,咱們已將數據庫安裝就緒。但將數據庫數據庫服務運行起來還須要啓動服務。MongoDB的服務有兩種,一種是啓動windows的服務,另外一種是經過命令行來建立臨時的服務。
當服務沒啓動,就直接連接數據庫,會拋出Error: couldn't connect to server 127.0.0.1:27017錯誤。
window服務模式:在管理員權限下,使用net命令進行服務控制。window服務是隱式的工做的,它將全部的日誌都寫入log日誌文件中,自己並無進行對運行的結果進行輸出。在整個數據庫,在正式服務模式下,都是使用這種方式
命令行模式:在不啓動動window服務的前提下,也能夠經過創建一個命令行窗口來提供MongoDB服務。這個模式下是顯示輸出的內容的,即日誌內容會直接打印在命令行窗口中。這種方式更利於數據庫應用的開發調試,更加直觀的顯示數據的操做與異常。當關閉命令行窗口後,MongoDB服務將會中止。
–dbpath:指定數據庫路徑
–logpath:指定日誌路徑
–fork:以守護進程的方式運行MongoDB,建立服務器進程
–auth:啓用用戶身份驗證(默認是不使用的)
–cpu:按期顯示CPU的CPU利用率和iowait
–port:指定端口號
a.命令行啓動
使用命令行模式啓動服務,以便於觀察數據庫的變化。
不使用身份驗證啓動服務:mongod --dbpath 「E:\MongoDB\data」
命令行中拋出了這樣的警告
WARNING: Access control is not enabled for the database. Read and write access to data and configuration is unrestricted.
這個警告是由於數據庫使用了非身份驗證驗證模式啓動,即mongod命令中沒有使用–auth參數。也就是說不使用身份驗證,任何人登入的都是超級管理員,在實際使用中須要額外注意。
使用身份驗證啓動服務:`mongod --dbpath 「E:\MongoDB\data」 --auth
這個模式下登陸mongo,依然能夠鏈接成功,可是若是不進行身份驗證,將沒法對數據庫進行操做。
b.window服務啓動
當啓動MongoDB服務以後,會按照配置文件設置的相關屬性,來啓動服務。注意配置文件中默認是不須要身份驗證的,當安裝結束以後,要修改配置文件爲身份驗證模式。
security: authorization: enabled
對於數據庫的首次訪問,尚未任何的帳戶權限。非身份驗證模式下,能夠隨意對數據庫進行操做。身份驗證模式下(首次登錄),只能進行數據庫的一個帳戶的建立操做,因此此時應該添加系統帳戶管理員(userAdminAnyDatabase)。若是添加了其餘的帳戶,將會致使數據庫因權限不足沒法進行任何操做。
數據庫的用戶及權限,都保存在admin數據庫的users中。咱們可使用如下語句建立用戶:
use admin db.createUser({ user:"userAdmin", pwd:"3832414122", roles:[{ role: "userAdminAnyDatabase",db:"admin"}] })
user:用戶名
pwd:密碼
roles:指定用戶的角色。數組的元素必須是對象,且包含兩個屬性(role-權限,db-已經存在的數據庫)
數據庫用戶角色(Database User Roles):read:授予User只讀數據的權限
readWrite:授予User讀寫數據的權限
數據庫管理角色(Database Administration Roles):dbAdmin:在當前dB中執行管理操做
dbOwner:在當前DB中執行任意操做
userAdmin:在當前DB中管理User
備份和還原角色(Backup and Restoration Roles):backup
restore
跨庫角色(All-Database Roles):readAnyDatabase:授予在全部數據庫上讀取數據的權限
readWriteAnyDatabase:授予在全部數據庫上讀寫數據的權限
userAdminAnyDatabase:授予在全部數據庫上管理User的權限
dbAdminAnyDatabase:授予管理全部數據庫的權限
集羣管理角色(Cluster Administration Roles):clusterAdmin:授予管理集羣的最高權限
clusterManager:授予管理和監控集羣的權限,A user with this role can access the config and local databases, which are used in sharding and replication, respectively.
clusterMonitor:授予監控集羣的權限,對監控工具具備readonly的權限
hostManager:管理Server
根據用戶所需權限,添加對應數據庫的管理者。使用db.auth(「user」,「pwd」);來在shell中切換用戶角色。
mongo -u username -p
mongodb://[username:password@]host1[:port1][,host2[:port2],...[,hostN[:portN]]][/[database][?options]]
mongodb://admin:123456@localhost/
mongodb://fred:foobar@132.232.169.227:4455/baz
方法1:db.changeUserPassword(「usertest」,「changepass」);
方法2:db.updateUser(「usertest」,{pwd:「changepass1」});
db.updateUser(「usertest」,{roles:[ {role:「read」,db:「testDB」} ]})
注:updateuser它是徹底替換以前的值,若是要新增或添加roles而不是代替它 則使用方法: db.grantRolesToUser() 和 db.revokeRolesFromUser()
db.grantRolesToUser(「usertest」, [{role:「readWrite」, db:「testDB」},{role:「read」, db:「testDB」}]) # 修改權限 db.revokeRolesFromUser(「usertest」,[{role:「read」, db:「testDB」}]) # 刪除權限:
數據類型 | 描述 |
---|---|
String | 字符串。存儲數據經常使用的數據類型。在 MongoDB 中,UTF-8 編碼的字符串纔是合法的。 |
Integer | 整型數值。用於存儲數值。根據你所採用的服務器,可分爲 32 位或 64 位。 |
Boolean | 布爾值。用於存儲布爾值(真/假)。 |
Double | 雙精度浮點值。用於存儲浮點值。 |
Min/Max keys | 將一個值與 BSON(二進制的 JSON)元素的最低值和最高值相對比。 |
Array | 用於將數組或列表或多個值存儲爲一個鍵。 |
Object | 用於內嵌文檔。 |
Null | 用於建立空值。 |
Symbol | 符號。該數據類型基本上等同於字符串類型,但不一樣的是,它通常用於採用特殊符號類型的語言。 |
Date | 日期時間。用 UNIX 時間格式來存儲當前日期或時間。你能夠指定本身的日期時間:建立 Date 對象,傳入年月日信息。 |
Object ID | 對象 ID。用於建立文檔的 ID。(若是不指定的話,mongodb默認會給一個 _id) |
Binary Data | 二進制數據。用於存儲二進制數據。 |
Code | 代碼類型。用於在文檔中存儲 JavaScript 代碼。 |
Regular expression | 正則表達式 |
use server1 db.server1.insert(obj);
【注意】數據庫建立,必需要插入一條數據後,show dbs命令纔會顯示,數據庫已經添加.
show dbs//查看全部數據庫 db//查看當前數據庫
【注意】這個操做並不會顯示系統全部的數據庫,而只顯示當前登陸用戶被受權的數據庫。
db.dropDatabase()//刪除當前數據庫
db.createCollection(name, options) db.createCollection("mycol", { capped : true, autoIndexId : true, size : 6142800, max : 10000 } )
參數說明:
name: 要建立的集合名稱
options: 可選參數, 指定有關內存大小及索引的選項
options 能夠是以下參數:
字段 | 類型 | 描述 |
---|---|---|
capped | 布爾(可選) | 若是爲 true,則建立固定集合。固定集合是指有着固定大小的集合,當達到最大值時,它會自動覆蓋最先的文檔。 當該值爲 true 時,必須指定 size 參數。 |
autoIndexId | 布爾(可選) | 如爲 true,自動在 _id 字段建立索引。默認爲 false。 |
size | 數值(可選) | 如爲固定集合指定一個最大值(以字節計)。 若是 capped 爲 true,也須要指定該字段。 |
max | 數值(可選) | 指定固定集合中包含文檔的最大數量。 |
show collections
db.collection.drop()
MongoDB 使用 insert() 或 save() 方法向集合中插入文檔.
db.COLLECTION_NAME.insert(document) db.COLLECTION_NAME.save(document) db.COLLECTION_NAME.insertMany([{"b": 3}, {'c': 4}])
【注意】:
若是插入數據是不存在的集合,將會自動建立集合。
insert: 若新增數據的主鍵已經存在,則會拋 org.springframework.dao.DuplicateKeyException 異常提示主鍵重複,不保存當前數據。
save: 若新增數據的主鍵已經存在,則會對當前已經存在的數據進行修改操做。
db.collection.find(query, projection)
query :可選,使用查詢操做符指定查詢條件
操做 | 格式 | RDBMS中相似語句 |
---|---|---|
等於 | {
|
db.col.find({"by":"菜鳥教程"}).pretty() where by = '菜鳥教程' |
小於 | {
|
db.col.find({"likes":{$lt:50}}).pretty() where likes < 50 |
小於等於 | {
|
db.col.find({"likes":{$lte:50}}).pretty() where likes <= 50 |
大於 |
|
db.col.find({"likes":{$gt:50}}).pretty() where likes > 50 |
大於等於 | {
|
db.col.find({"likes":{$gte:50}}).pretty() where likes >= 50 |
不等於 | {
|
db.col.find({"likes":{$ne:50}}).pretty() where likes != 50 |
數據類型 | {
|
db.col.find({"likes":{$type:1}}).pretty() where likes != 50也可使用正則:db.col.find({title:/^教/}) |
projection :可選,使用投影操做符指定返回的鍵。查詢時返回文檔中全部鍵值, 只需省略該參數便可(默認省略)。
返回指定字段和_id字段:在結果集中,只有item和qty字段,默認_id字段也是返回的。代碼以下:
db.inventory.find( { type: ‘food’}, { item: 1, qty: 1} )
僅返回指定字段:能夠經過在projection中指定排除_id字段將其從結果中去掉。代碼以下:
db.inventory.find( { type: ‘food’}, { item: 1, qty:1, _id:0} )
返回除排除掉之外的字段:可使用一個projection排除一個或者一組字段,以下: 代碼以下:
db.inventory.find( { type: ‘food’}, { type:0} )
ps:若是你須要以易讀的方式來讀取數據,可使用 pretty() 方法,pretty() 方法以格式化的方式來顯示全部文檔。語法格式以下:
db.COLLECTION_NAME.find().pretty()
update() 方法用於更新已存在的文檔。語法格式以下:
db.collection.update( <query>, <update>, { upsert: <boolean>, multi: <boolean>, writeConcern: <document> } )
參數說明:
query : update的查詢條件,相似sql update查詢內where後面的,規則與查詢部分相同。
update : update的對象和一些更新的操做符(如,,,inc…)等,也能夠理解爲sql update查詢內set後面的
upsert : 可選,這個參數的意思是,若是不存在update的記錄,是否插入objNew,true爲插入,默認是false,不插入。
multi : 可選,mongodb 默認是false,只更新找到的第一條記錄,若是這個參數爲true,就把按條件查出來多條記錄所有更新。
writeConcern :可選,拋出異常的級別。
WriteConcern.NONE:沒有異常拋出
WriteConcern.NORMAL:僅拋出網絡錯誤異常,沒有服務器錯誤異常
WriteConcern.SAFE:拋出網絡錯誤異常、服務器錯誤異常;並等待服務器完成寫操做。
WriteConcern.MAJORITY: 拋出網絡錯誤異常、服務器錯誤異常;並等待一個主服務器完成寫操做。
WriteConcern.FSYNC_SAFE: 拋出網絡錯誤異常、服務器錯誤異常;寫操做等待服務器將數據刷新到磁盤。
WriteConcern.JOURNAL_SAFE:拋出網絡錯誤異常、服務器錯誤異常;寫操做等待服務器提交到磁盤的日誌文件。
WriteConcern.REPLICAS_SAFE:拋出網絡錯誤異常、服務器錯誤異常;等待至少2臺服務器完成寫操做。
https://www.cnblogs.com/AK47Sonic/p/7560177.html
咱們在集合 col 中插入以下數據:
db.col.update({'title':'MongoDB 教程'},{$set:{'title':'MongoDB'}})
實例:https://www.cnblogs.com/zhang-yong/p/7390393.html
{ $inc : { field : value } }。意思對一個數字字段field增長value。
【注意】value能夠爲整數也能夠爲負數。
{ $set : { field : value } }。賦值語句
{ $unset : { field : 任意內容} }。就是刪除field字段
{ $push : { field : value } }。把value追加到field裏面去,field必定要是數組類型才行,若是field不存在,會新增一個數組類型加進去。
{ $pushAll : { field : value_array } }。將數組中的每一項,追加多個值到一個數組字段內。
{ $addToSet : { field : value } }。增長一個值到數組內,並且只有當這個值不在數組內才增長。
刪除最後一個值:{ $pop : { field : 1 } }
刪除第一個值:{ $pop : { field : -1 } }
$pull : { field : value } }。從數組field內刪除一個等於value值。
{ $pullAll : { field : value_array } }。能夠一次刪除數組內的多個值。
$是他本身的意思,表明按條件找出的數組裏面某項他本身。
t.find()
{ "_id" : ObjectId("4b97e62bf1d8c7152c9ccb74"), "title" : "ABC", "comments" : [ { "by" : "joe", "votes" : 3 }, { "by" : "jane", "votes" : 7 } ] }
t.update( {'comments.by':'joe'}, {$inc:{'comments.$.votes':1}}, false, true )
t.find()
{ "_id" : ObjectId("4b97e62bf1d8c7152c9ccb74"), "title" : "ABC", "comments" : [ { "by" : "joe", "votes" : 4 }, { "by" : "jane", "votes" : 7 } ] }
remove() 方法的基本語法格式以下所示:
db.collection.remove( <query>, { justOne: <boolean>, writeConcern: <document> } )
參數說明:
query :(可選)刪除的文檔的條件。
justOne : (可選)若是設爲 true 或 1,則只刪除一個文檔,若是不設置該參數,或使用默認值 false,則刪除全部匹配條件的文檔。
writeConcern :(可選)拋出異常的級別。
https://www.cnblogs.com/AK47Sonic/p/7560177.html
db.COLLECTION_NAME.find().limit(NUMBER) db.COLLECTION_NAME.find().limit(NUMBER).skip(NUMBER)
limit限制輸出個數,skip跳過輸出個數。二者能夠單獨使用也能夠結合使用。
db.COLLECTION_NAME.find().sort({title:-1,likes:1})
sort()函數接收一個對象,對象的第一個屬性爲主排序,主排序相同的內容再實現後面屬性的排序。
【注意】:skip(), limilt(), sort() 三個放在一塊兒執行的時候,執行的順序是先 sort(), 而後是 skip(),最後是顯示的 limit()。
創建索引能夠提高數據查找的速度,基本語法格式以下所示:
db.collection.createIndex(keys, options) db.col.createIndex({"title":1})
keys對象參數爲1表示正序創建索引,-1表示逆序創建索引。若是添加多個屬性爲聯合索引。
options可選屬性以下表
Parameter Type Description
background Boolean 建索引過程會阻塞其它數據庫操做,background可指定之後臺方式建立索引,即增長 「background」 可選參數。 「background」 默認值爲false。
unique Boolean 創建的索引是否惟一。指定爲true建立惟一索引。默認值爲false.
name string 索引的名稱。若是未指定,MongoDB的經過鏈接索引的字段名和排序順序生成一個索引名稱。用於索引刪除
dropDups Boolean 3.0+版本已廢棄。在創建惟一索引時是否刪除重複記錄,指定 true 建立惟一索引。默認值爲 false.
sparse Boolean 對文檔中不存在的字段數據不啓用索引;這個參數須要特別注意,若是設置爲true的話,在索引字段中不會查詢出不包含對應字段的文檔.。默認值爲 false.
expireAfterSeconds integer 指定一個以秒爲單位的數值,完成 TTL設定,設定集合的生存時間。
v index version 索引的版本號。默認的索引版本取決於mongod建立索引時運行的版本。
weights document 索引權重值,數值在 1 到 99,999 之間,表示該索引相對於其餘索引字段的得分權重。
default_language string 對於文本索引,該參數決定了停用詞及詞幹和詞器的規則的列表。 默認爲英語
language_override string 對於文本索引,該參數指定了包含在文檔中的字段名,語言覆蓋默認的language,默認值爲 language.
db.col.getIndexes()
db.col.totalIndexSize()
db.col.dropIndexes()
db.col.dropIndex("索引名稱")
利用 TTL 集合對存儲的數據進行失效時間設置:通過指定的時間段後或在指定的時間點過時,MongoDB 獨立線程去清除數據。
例如在數據記錄中 createDate 爲日期類型以後180刪除:
db.col.createIndex({"createDate": 1},{expireAfterSeconds: 180})
由記錄中設定日期點清除:使用{expireAfterSeconds: 0}
其餘注意事項:
索引關鍵字段必須是 Date 類型。
非當即執行:掃描 Document 過時數據並刪除是獨立線程執行,默認 60s 掃描一次,刪除也不必定是當即刪除成功。
單字段索引,混合索引不支持。
mongodump -h localhost -d server1 -u server1 -p xxx --authenticationDatabase admin -o E:\log
參數說明:
-h:連接主機
-d:備份數據庫名
-u:用戶名
-p:密碼
-o:導出地址
–authenticationDatabase admin:指定身份驗證數據庫
mongorestore -h localhost -d server1 -u server1 -p xxx --authenticationDatabase admin --dir E:\log\server1
注意:
–host <:port>, -h <:port>:
MongoDB所在服務器地址,默認爲: localhost:27017
–db , -d :
須要恢復的數據庫實例,例如:test,固然這個名稱也能夠和備份時候的不同,好比test2
–drop:
恢復的時候,先刪除當前數據,而後恢復備份的數據。就是說,恢復後,備份後添加修改的數據都會被刪除,慎用哦!
–dir:
指定備份的目錄
你不能同時指定 和 --dir 選項。
【注意】在使用身份驗證模式下,須要使用root權限來查看數據庫性能。通常用戶沒有這個能力,沒法打開性能監控。
mongostat -u root -p xxx --authenticationDatabase admin
mongostat --host 192.168.11.11:27017 --username root --password 12345678 --authenticationDatabase admin
參數說明:
–host :指定IP地址和端口,也能夠只寫IP,而後使用–port參數指定端口號
–username: 若是開啓了認證,則須要在其後填寫用戶名
–password : 不用多少,確定是密碼
–authenticationDatabase:若開啓了認證,則須要在此參數後填寫認證庫(注意是認證上述帳號的數據庫)
輸出字段解釋說明:
insert/s : 官方解釋是每秒插入數據庫的對象數量,若是是slave,則數值前有*,則表示複製集操做
query/s : 每秒的查詢操做次數
update/s : 每秒的更新操做次數
delete/s : 每秒的刪除操做次數
getmore/s: 每秒查詢cursor(遊標)時的getmore操做數
command: 每秒執行的命令數,在主從系統中會顯示兩個值(例如 3|0),分表表明 本地|複製 命令注: 一秒內執行的命令數好比批量插入,只認爲是一條命令(因此意義應該不大)
dirty: 僅僅針對WiredTiger引擎,官網解釋是髒數據字節的緩存百分比
used:僅僅針對WiredTiger引擎,官網解釋是正在使用中的緩存百分比
flushes:
For WiredTiger引擎:指checkpoint的觸發次數在一個輪詢間隔期間
For MMAPv1 引擎:每秒執行fsync將數據寫入硬盤的次數
注:通常都是0,間斷性會是1, 經過計算兩個1之間的間隔時間,能夠大體瞭解多長時間flush一次。flush開銷是很大的,若是頻繁的flush,可能就要找找緣由了
vsize: 虛擬內存使用量,單位MB (這是 在mongostat 最後一次調用的總數據)
res: 物理內存使用量,單位MB (這是 在mongostat 最後一次調用的總數據)注:這個和你用top看到的同樣, vsize通常不會有大的變更, res會慢慢的上升,若是res常常忽然降低,去查查是否有別的程序狂吃內存。
qr: 客戶端等待從MongoDB實例讀數據的隊列長度
qw:客戶端等待從MongoDB實例寫入數據的隊列長度
ar: 執行讀操做的活躍客戶端數量
aw: 執行寫操做的活客戶端數量注:若是這兩個數值很大,那麼就是DB被堵住了,DB的處理速度不及請求速度。看看是否有開銷很大的慢查詢。若是查詢一切正常,確實是負載很大,就須要加機器了
netIn:MongoDB實例的網絡進流量
netOut:MongoDB實例的網絡出流量注:此兩項字段表名網絡帶寬壓力,通常狀況下,不會成爲瓶頸
conn: 打開鏈接的總數,是qr,qw,ar,aw的總和注:MongoDB爲每個鏈接建立一個線程,線程的建立與釋放也會有開銷,因此儘可能要適當配置鏈接數的啓動參數,maxIncomingConnections,阿里工程師建議在5000如下,基本知足多數場景
mongotop -u root -p xxx --authenticationDatabase admin
mongotop --host 192.168.11.11:27017 --username root --password 12345678 --authenticationDatabase admin
參數說明:
–host :指定IP地址和端口,也能夠只寫IP,而後使用–port參數指定端口號
–username: 若是開啓了認證,則須要在其後填寫用戶名
–password : 不用多少,確定是密碼
–authenticationDatabase:若開啓了認證,則須要在此參數後填寫認證庫(注意是認證上述帳號的數據庫)
輸出結果字段說明:
ns:包含數據庫命名空間,後者結合了數據庫名稱和集合。
total:mongod花費的時間工做在這個命名空間提供總額。
read:提供了大量的時間,這mongod花費在執行讀操做,在此命名空間。
write:提供這個命名空間進行寫操做,這mongod花了大量的時間。
前面介紹的內容都是數據基本的增刪改查,可是NoSQL出現了一個多個集合之間數據組織的問題。NoSQL不像關係型數據庫,經過關係來實現多數據直接的結合。要想實現多文檔,多集合的管理數據,就要使用應用層來回查詢。使用這種方式將會消耗大量的網絡數據,不利於數據庫操做的效率。
可是MongoDB做爲最像關係型數據庫的非關係型數據庫,也爲咱們提供了多集合聯合查詢的功能。
MongoDB中聚合的方法使用aggregate()。聚合就是能夠對數據查詢進行屢次過濾操做,以達到複雜查詢的目的。聚合查詢函數接收一個數組,數組裏面是若干個對象,每一個對象就是一次查詢的步驟。前一個查詢的查詢結果,做爲後一個查詢的篩選內容。
db.getCollection("student").aggregate( [ { "$match" : { "age" : { "$gt" : 20.0 } } }, { "$lookup" : { "from" : "room", "localField" : "class", "foreignField" : "name", "as" : "num" } }, { "$unwind" : { "path" : "$num", "includeArrayIndex" : "l", "preserveNullAndEmptyArrays" : false } }, { "$project" : { "num.name" : 1.0 } }, { "$count" : "cou" } ]
經常使用的管道查詢操做:
$project:修改輸入文檔的結構。能夠用來重命名、增長或刪除域,也能夠用於建立計算結果以及嵌套文檔。
match:用於過濾數據,只輸出符合條件的文檔。match:用於過濾數據,只輸出符合條件的文檔。match:用於過濾數據,只輸出符合條件的文檔。match使用MongoDB的標準查詢操做。
$limit:用來限制MongoDB聚合管道返回的文檔數。
$skip:在聚合管道中跳過指定數量的文檔,並返回餘下的文檔。
$unwind:將文檔中的某一個數組類型字段拆分紅多條,每條包含數組中的一個值。
$group:將集合中的文檔分組,可用於統計結果。
$sort:將輸入文檔排序後輸出。
$geoNear:輸出接近某一地理位置的有序文檔。
$lookup:連表查詢
使用聚合函數能夠實現服務器級別的複雜查詢,可是查詢數據時,編寫查詢語句會十分複雜,這時可使用視圖來虛擬查詢。將須要的複雜查詢提取成一個視圖,應用層只須要查詢視圖內容便可。
【注意】:視圖是一個虛表,系統並無將視圖數據存儲,而是隻記錄了一下數據的來源方法,這個視圖來源依據存儲在System集合中。當基本集合更新以後,視圖就會跟着更新了。