mongodb 游標 (學習筆記三)

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) //打開的游標總數
    }
}
*/
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
【社區(qū)內容提示】社區(qū)部分內容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內容

友情鏈接更多精彩內容