爲了以您希望的方式有效地「瀏覽」結果,最好使用「範圍查詢」並保留您處理的最後一個值。
你想要的「排序關鍵字」這裏是_id
,這樣就使得事情變得簡單:
首先你希望你在與.createIndex()
做正確的順序是不是方法已過時索引:
db.collection.createIndex({ "language": 1, "_id": -1 })
然後你想要做一些簡單的處理,從開始:
var lastId = null;
var cursor = db.collection.find({language:"hi"});
cursor.sort({_id:-1}).limit(5000).forEach(funtion(doc) {
// do something with your document. But always set the next line
lastId = doc._id;
})
這是第一批。現在,當你移動到下一個:
var cursor = db.collection.find({ "language":"hi", "_id": { "$lt": lastId });
cursor.sort({_id:-1}).limit(5000).forEach(funtion(doc) {
// do something with your document. But always set the next line
lastId = doc._id;
})
這樣作出選擇時,lastId
值總是考慮。您可以在每個批次之間存儲它,並從最後一個繼續。
這比使用.skip()
處理效率高很多,無論索引是否「仍然」都需要「跳過」集合中的所有數據直到跳過點。
使用$lt
操作符可以「過濾」您已處理的所有結果,因此您可以更快地移動。
不是。你應該問的是「是否有更好的方式來分頁我的結果」,並解釋你的實際使用情況,而不是假設的情況。 –
我試圖獲得5000批處理結果,以升序或降序方式處理文檔中「hi」作爲語言字段中的值。所以我使用這個查詢,其中我每次通過遞增「跳過」值跳過處理的文檔。 – user2710961
那裏。現在看看你提出的問題是多少描述性的。請修改您的問題以包含該內容以及更合適的標題。這是一個很好的問題。你問的是一個可怕的問題。所以你只需要5000個,然後繼續下一批,等等,對嗎? –