Using a generator to iterate over a large collection in Mongo
我有一个包含 500K 文档的集合,这些文档存储在单个节点 mongo 上。我的 pymongo cursor.find() 时不时会因为超时而失败。
虽然我可以将
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | 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 |
然后我使用以下方法调用此方法:
1 2 3 | 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' 检查不保证返回 false。
1 | cursor = collection.find({}, no_cursor_timeout=True) |
您不需要编写自己的生成器函数。
的生成器
为什么不使用
1 2 | for result in results: yield result |
for 循环应该为你处理