我有一个包含50万多个文档的集合,存储在单个节点mongo上。不时地,我的pymongo cursor.find()会因为超时而失败。
虽然我可以将find设置为忽略超时,但我不喜欢这种方法。相反,我尝试了一个生成器(改编自this答案和this链接)。
我使用以下代码调用此方法:
问题: 我的迭代器没有返回相同数量的结果。问题在于next()会推进光标。因此,每次调用都会丢失一个元素...
问题: 有没有办法修改这段代码,以便我可以检查next是否存在?Pymongo 3x不提供hasNext()和'alive' check 不能保证返回false。
虽然我可以将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()会推进光标。因此,每次调用都会丢失一个元素...
问题: 有没有办法修改这段代码,以便我可以检查next是否存在?Pymongo 3x不提供hasNext()和'alive' check 不能保证返回false。
0到1000
等于[0,1,2,3......,999]
,下一个开始是1000
但你会失去一个(可能是最后一个)。所以索引号永远不等于长度号。 - dsgdfgfirst_result_in_batch = results.next()
,从而捕获您当前正在丢弃的元素(如果有的话)?然后您将在for循环之前放置yield first_result_in_batch
,从而按正确的顺序将该元素提供给调用者。(我不了解MongoDB,所以可能会漏掉一些东西。) - D-Von