Mongodb中find()函數返回一個游標,客戶端通過對游標進行一些設置就能對查詢結果進行有效地控制,如可以限制查詢得到的結果數量、跳過部分結果、或對結果集按任意鍵進行排序等。
-
hasNext
判斷是否還有更多的文檔
-
next
用來獲取下一條文檔
var cursor = db.foo.find()
while(cursor.hasNext()) {
print(cursor.next().name)
}
-
toArray
將查詢結果放倒數組中
var cursor = db.foo.find({age: 22})
printjson(cursor.toArray())
-
count
集合中的文檔數量
var cursor = db.foo.find()
cursor.count()
-
limit
限制結果數量
db.foo.find()limit(5)
-
skip
跳過指定數目的文檔(略過過多的文檔會導致性能問題)
db.foo.find().skip(2)
-
sort
接受鍵值對對象作為參數,鍵對應文檔的鍵名,值代表排序方向(1為生序,-1為降序)
db.foo.find({age: 22}).sort({name: 1})
limit、skip、sort這3個方法可以組合使用,因為當調用find函數的時候,shell并不立即查詢數據庫,而是等真正開始獲取結果時才發(fā)送請求。
下面幾種表達時等價的:
var cursor = db.foo.find().sort({x: 1}).limit(3).skip(2)
var cursor = db.foo.find().limit(3).sort({x: 1}).skip(2)
var cursor = db.foo.find().skip(2).limit(3).sort({x: 1})
-
objsLeftInBatch
查看當前批次剩余的未被迭代的文檔數量。
查詢發(fā)往服務器,shell立即獲取前100個結果或者前4MB數據(兩者之中較小者),返回的文檔會緩存在內存中,這樣下次調用next或者hasNext時就不必再次連接服務器獲取結果了。
如果不將find函數返回的游標賦值給一個局部變量進行保存的話,默認情況下游標會自動迭代20次。
cursor.objsLeftInBatch()
-
snapshot
對查詢結果使用快照。
游標可能會返回那些由于體積變大而被移動到集合末尾的文檔,使用快照,查詢會在“_id”索引上遍歷執(zhí)行,這樣可以確保每個文檔只會被返回一次,從而保證獲取結果的一致性。
db.foo.find().snapshot()
-
游標的生命周期
游標在完成匹配結果的迭代時,它會清除自身。
如果游標已經不在作用域內,驅動程序會向服務器發(fā)送一條特別消息,讓其銷毀游標。
如果一個游標在10分鐘內沒有使用的話,數據庫游標也會自行銷毀。
-
serverStatus查看當前系統(tǒng)的游標狀態(tài)
db.serverStatus().metrics.cursor
/*
{
"timedOut" : NumberLong(0), //數據庫啟動以來超時的游標個數
"open" : {
"noTimeout" : NumberLong(0), //使用noTimeout阻止超時的游標個數
"pinned" : NumberLong(0), //打開的pinned類型的游標個數
"total" : NumberLong(0) //打開的游標總數
}
}
*/