5

単一ノードの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 を返す保証はありません。

4

2 に答える 2

2

この.find()メソッドは、追加のキーワード引数を取ります。それらの1つはno_cursor_timeout、設定する必要があるものですTrue

cursor = collection.find({}, no_cursor_timeout=True)

独自のジェネレータ関数を記述する必要はありません。このfind()メソッドは、ジェネレーターのようなオブジェクトを返します。

于 2016-09-21T07:58:19.403 に答える
1

使わない理由

for result in results:
    yield result

for ループはあなたのStopIterationために処理する必要があります。

于 2016-09-21T02:25:38.403 に答える