我有一個包含500K +文檔的集合,存儲在單個節點mongo上。每隔一段時間我的pymongo cursor.find()都會失敗,因爲它會超時。使用生成器遍歷Mongo中的大集合
雖然我可以設置find
忽略超時,但我不喜歡這種方法。相反,我嘗試了發電機(改編自this答案,this鏈接):
def mongo_iterator(self, cursor, limit=1000):
skip = 0
while True:
results = cursor.find({}).sort("signature", 1).skip(skip).limit(limit)
try:
results.next()
except StopIteration:
break
for result in results:
yield result
skip += limit
然後我用調用這個方法:
ref_results_iter = self.mongo_iterator(cursor=latest_rents_refs, limit=50000)
for ref in ref_results_iter:
results_latest1.append(ref)
問題: 我的迭代器不返回相同數量的結果。問題是next()會提前移動光標。因此,對於每一個電話,我失去了一個元素...
問題: 有沒有一種方法來適應此代碼,以便我可以檢查下一個存在? Pymongo 3x不提供hasNext()和'alive'檢查is not guaranteed以返回false。
'0到1000'等於'[0,1,2,3 ......,999]',下一個開始是'1000',但你會失去一個(可能是last_one)。所以'索引號不等於length_number'。 – dsgdfg
它會說'first_result_in_batch = results.next()',從而捕獲你目前丟棄的元素(如果有的話)?然後你可以在for循環中放置'yield first_result_in_batch',從而以正確的順序將該元素賦給調用者。 (我不知道MongoDB,所以也許我錯過了一些東西。) –