単一ノードのmongoに保存されている50万以上のドキュメントのコレクションがあります。時々、私の pymongo cursor.find() がタイムアウトして失敗します。
タイムアウトを無視するように設定することもできますがfind
、私はそのアプローチが好きではありません。代わりに、ジェネレーターを試しました(この回答とこのリンクから適応):
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() がカーソルを進めることです。したがって、呼び出しごとに1つの要素が失われます...
質問: next が存在するかどうかを確認できるように、このコードを適合させる方法はありますか? Pymongo 3x は hasNext() を提供せず、'alive' チェックがfalse を返す保証はありません。