Mongodb(二)

MongoDB學習筆記

1、什麼是MongoDB

​ MongoDB 是由C++語言編寫的,是一個基於分佈式文件存儲的開源數據庫系統。在高負載的狀況下,添加更多的節點,能夠保證服務器性能。MongoDB 旨在爲WEB應用提供可擴展的高性能數據存儲解決方案。MongoDB 將數據存儲爲一個文檔,數據結構由鍵值(key=>value)對組成。MongoDB 文檔相似於 JSON 對象。字段值能夠包含其餘文檔,數組及文檔數組。MongoDB 是一個基於分佈式文件存儲的數據庫。由 C++ 語言編寫。旨在爲 WEB 應用提供可擴展的高性能數據存儲解決方案。MongoDB 是一個介於關係數據庫和非關係數據庫之間的產品,是非關係數據庫當中功能最豐富,最像關係數據庫的。html

2、什麼是NoSQL

NoSQL,指的是非關係型的數據庫。NoSQL有時也稱做 "Not Only SQL" 的縮寫,是對不一樣於傳統的關係型數據庫的數據庫管理系統的統稱。正則表達式

NoSQL用於超大規模數據的存儲。(例如谷歌或Facebook天天爲他們的用戶收集萬億比特的數據)。這些類型的數據存儲不須要固定的模式,無需多餘操做就能夠橫向擴展spring

今天咱們能夠經過第三方平臺(如:Google,Facebook等)能夠很容易的訪問和抓取數據。用戶的我的信息,社交網絡,地理位置,用戶生成的數據和用戶操做日誌已經成倍的增長。咱們若是要對這些用戶數據進行挖掘,那SQL數據庫已經不適合這些應用了, NoSQL 數據庫的發展卻能很好的處理這些大的數據。sql

NoSQL的優勢/缺點

優勢

  • 高可擴展性mongodb

  • 分佈式計算shell

  • 低成本數據庫

  • 架構的靈活性,半結構化數據express

  • 沒有複雜的關係json

缺點

  • 沒有標準化
  • 有限的查詢功能(到目前爲止)
  • 最終一致是不直觀的程序

3、數據庫安裝

安裝教程: https://www.cnblogs.com/qzdd/p/12304163.htmlwindows

安裝版本:V4.2.0

在這裏記錄一下本身遇到的坑:

1.install mongoDB compass

在第一次安裝的時候,沒有注意勾選上了安裝這個部分,結果安裝程序一直卡在那塊。最後又從新安裝了一次才解決了問題。mongoDB compass主要是MongoDB的一個圖形化界面,後期能夠單獨安裝。

2.安裝中提示啓動失敗

以前MongoDB按照默認路徑裝到了C盤。後來由於C盤的空間有限,後來又卸載安裝在了E盤。以前在C盤安裝的時候,順風順水沒有出一點問題。可是在E盤安裝時,遇到了一些問題。在安裝程序還在進行的時候,忽然跳出來一個提示,顯示MongoDB服務沒法啓動。經過查找一些資料,知道了當系統啓動服務的時候須要得到管理員權限,當程序安裝在C盤的時候,安裝程序能夠直接得到較高的權限,可是安裝在其餘位置,就會由於安裝權限不足,致使服務沒法啓動。 這時點擊忽略,直接完成安裝,以後經過命令行獲取系統管理員權限後,手動啓動服務。

3.安裝MongoDB服務出現問題

當程序安裝完成以後,就須要安裝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的報錯.根據他的提示,沒法打開日誌文件。出現這個問題的緣由是由於,日誌的地址沒有改動,舊日誌與新日誌之間權限出現了衝突。致使沒法更新。能夠嘗試刪除服務,從新建立來解決這個問題。

4、數據庫鏈接及權限管理

使用MongoDB中有一個很大的困惑,盡然不須要密碼就能夠登陸?那它的安全性如何保證呢?權限劃分又是如何進行呢?對比MySQL在安裝成功以後就會有個初始密碼,MongoDB是否是不安全呢?下面咱們就分析一下,這些問題:

1.啓動服務

經過上一個章節的操做,咱們已將數據庫安裝就緒。但將數據庫數據庫服務運行起來還須要啓動服務。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

2.用戶建立

對於數據庫的首次訪問,尚未任何的帳戶權限。非身份驗證模式下,能夠隨意對數據庫進行操做。身份驗證模式下(首次登錄),只能進行數據庫的一個帳戶的建立操做,因此此時應該添加系統帳戶管理員(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中切換用戶角色。

3.使用身份驗證鏈接到數據庫

啓動shell時,進行身份驗證
mongo -u username -p
默認登陸後連接不一樣服務
mongodb://[username:password@]host1[:port1][,host2[:port2],...[,hostN[:portN]]][/[database][?options]]
使用用戶 admin 使用密碼 123456 鏈接到本地的 MongoDB 服務上。輸出結果以下所示:
mongodb://admin:123456@localhost/
使用用戶名fred,密碼foobar登陸132.232.169.227的4455端口的baz數據庫。
mongodb://fred:foobar@132.232.169.227:4455/baz

4.修改密碼

方法1:db.changeUserPassword(「usertest」,「changepass」);
方法2:db.updateUser(「usertest」,{pwd:「changepass1」});

5.修改權限

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」}]) # 刪除權限:

5、MongoDB數據類型

數據類型 描述
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 正則表達式

6、數據庫常規功能使用

1.建立數據庫

use server1
db.server1.insert(obj);

【注意】數據庫建立,必需要插入一條數據後,show dbs命令纔會顯示,數據庫已經添加.

2.查看數據庫

show dbs//查看全部數據庫
db//查看當前數據庫

【注意】這個操做並不會顯示系統全部的數據庫,而只顯示當前登陸用戶被受權的數據庫。

3.刪除數據庫

db.dropDatabase()//刪除當前數據庫

4.建立集合

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 數值(可選) 指定固定集合中包含文檔的最大數量。

5.查看集合

show collections

6.刪除集合

db.collection.drop()

7.插入文檔

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: 若新增數據的主鍵已經存在,則會對當前已經存在的數據進行修改操做。

8.查詢文檔

db.collection.find(query, projection)

query :可選,使用查詢操做符指定查詢條件

操做 格式 RDBMS中相似語句
等於 { : } 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
數據類型 { :{$type: }} 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()

9.更新文檔

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'}})

update(更新的操做符)說明:

實例:https://www.cnblogs.com/zhang-yong/p/7390393.html

1.$inc

{ $inc : { field : value } }。意思對一個數字字段field增長value。

【注意】value能夠爲整數也能夠爲負數。

2.$set

{ $set : { field : value } }。賦值語句

3.$unset

{ $unset : { field : 任意內容} }。就是刪除field字段

4.$push

{ $push : { field : value } }。把value追加到field裏面去,field必定要是數組類型才行,若是field不存在,會新增一個數組類型加進去。

5.$pushAll

{ $pushAll : { field : value_array } }。將數組中的每一項,追加多個值到一個數組字段內。

6.$addToSet

{ $addToSet : { field : value } }。增長一個值到數組內,並且只有當這個值不在數組內才增長。

7.$pop

刪除最後一個值:{ $pop : { field : 1 } }

刪除第一個值:{ $pop : { field : -1 } }

8.$pull

$pull : { field : value } }。從數組field內刪除一個等於value值。

9.$pullAll

{ $pullAll : { field : value_array } }。能夠一次刪除數組內的多個值。

10.$ 操做符

$是他本身的意思,表明按條件找出的數組裏面某項他本身。

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 } ] }

10.刪除文檔

remove() 方法的基本語法格式以下所示:

db.collection.remove(
   <query>,
   {
     justOne: <boolean>,
     writeConcern: <document>
   }
)

參數說明:

query :(可選)刪除的文檔的條件。

justOne : (可選)若是設爲 true 或 1,則只刪除一個文檔,若是不設置該參數,或使用默認值 false,則刪除全部匹配條件的文檔。

writeConcern :(可選)拋出異常的級別。

https://www.cnblogs.com/AK47Sonic/p/7560177.html

11.輸出結果限制

db.COLLECTION_NAME.find().limit(NUMBER)
db.COLLECTION_NAME.find().limit(NUMBER).skip(NUMBER)

limit限制輸出個數,skip跳過輸出個數。二者能夠單獨使用也能夠結合使用。

12.排序(sort)

db.COLLECTION_NAME.find().sort({title:-1,likes:1})

sort()函數接收一個對象,對象的第一個屬性爲主排序,主排序相同的內容再實現後面屬性的排序。

【注意】:skip(), limilt(), sort() 三個放在一塊兒執行的時候,執行的順序是先 sort(), 而後是 skip(),最後是顯示的 limit()。

13.索引

創建索引能夠提高數據查找的速度,基本語法格式以下所示:

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 掃描一次,刪除也不必定是當即刪除成功。
單字段索引,混合索引不支持。

7、數據庫備份與恢復

將數據庫備份成文件

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 選項。

8、數據庫性能監控

【注意】在使用身份驗證模式下,須要使用root權限來查看數據庫性能。通常用戶沒有這個能力,沒法打開性能監控。

1.mongostat 命令

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如下,基本知足多數場景

2.mongotop 命令

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花了大量的時間。

9、數據庫高級查詢

前面介紹的內容都是數據基本的增刪改查,可是NoSQL出現了一個多個集合之間數據組織的問題。NoSQL不像關係型數據庫,經過關係來實現多數據直接的結合。要想實現多文檔,多集合的管理數據,就要使用應用層來回查詢。使用這種方式將會消耗大量的網絡數據,不利於數據庫操做的效率。

可是MongoDB做爲最像關係型數據庫的非關係型數據庫,也爲咱們提供了多集合聯合查詢的功能。

1.聚合通道

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:連表查詢

2.視圖

使用聚合函數能夠實現服務器級別的複雜查詢,可是查詢數據時,編寫查詢語句會十分複雜,這時可使用視圖來虛擬查詢。將須要的複雜查詢提取成一個視圖,應用層只須要查詢視圖內容便可。

【注意】:視圖是一個虛表,系統並無將視圖數據存儲,而是隻記錄了一下數據的來源方法,這個視圖來源依據存儲在System集合中。當基本集合更新以後,視圖就會跟着更新了。

相關文章
相關標籤/搜索