db.collection.find() 方法里面的游標
- 該方法最后會返回一個 cursor
- 正常情況下,訪問文檔必須迭代游標
重點事項
- 當調用 find() 函數時,Shell 並不立即查詢數據庫,而是等真正開始獲取結果時才發送查詢請求
- 游標對象的每個方法幾乎都會返回游標對象本身,這樣可以方便進行鏈式函數的調用
- 在 MongoDB Shell 中使用游標輸出文檔包含兩種情況,如果不將 find() 函數返回的游標賦值給一個局部變量進行保存,在默認情況下游標會自動迭代 20 次。如果將 find() 函數返回的游標賦值給一個局部變量,則可以使用游標對象提供的函數進行手動迭代。
- 使用清空后的游標,進行迭代輸出時,顯示的內容為空
- 游標從創建到被銷毀的整個過程存在的時間,被稱為游標的生命周期,包括游標的創建、使用及銷毀三個階段。當客戶端使用 find() 函數向服務器端發起一次查詢請求時,會在服務器端創建一個游標,然后就可以使用游標函數來操作查詢結果
迭代循環游標
直接調用變量
var myCursor = db.users.find( { type: 2 } ); myCursor
使用 cursor 的 next() 方法
var myCursor = db.users.find( { type: 2 } ); while (myCursor.hasNext()) { print(tojson(myCursor.next())); }
使用 printjson() 代替 print() 方法
var myCursor = db.users.find( { type: 2 } ); while (myCursor.hasNext()) { printjson(myCursor.next()); }
使用 cursor 的 forEach() 方法
var myCursor = db.users.find( { type: 2 } ); myCursor.forEach(printjson);
使用 pretty() 直接打印
這不香嗎,為什么要用游標還寫代碼,搞不懂搞不懂
> db.inventory.find({item : /^p/}).pretty()
常見的游標方法名
方法名 | 作用 |
---|---|
hasNext | 判斷是否有更多的文檔 |
next | 用來獲取下一條文檔 |
toArray | 將查詢結構放到數組中 |
count | 查詢的結果為文檔的總數量 |
limit | 限制查詢結果返回數量 |
skip | 跳過指定數目的文檔 |
sort | 對查詢結果進行排序 |
objsLeftlnBatch | 查看當前批次剩余的未被迭代的文檔數量 |
addOption | 為游標設置輔助選項,修改游標的默認行為 |
hint | 為查詢強制使用指定索引 |
explain | 用於獲取查詢執行過程報告 |
snapshot | 對查詢結果使用快照 |
(后面會對常用的游標方法進行詳解)
以下三種情況會讓游標被銷毀
- 客戶端保存的游標變量不在作用域內。
- 游標遍歷完成后,或者客戶端主動發送終止消息
- 在服務器端 10 分鍾內未對游標進行操作