2017-02-22 9 views
1

私はMongoDBのコレクションがメモリに完全に読み込まれるほど大きく、PyMongoを使用して作業したいと考えています。pymongo .find()の結果が指定されたサイズのリストとして返されました

それぞれのアイテムについて、別のコレクションで検索して結果に関数を適用する必要があります。

最初のアルゴリズム私がいた思い付いた:それはサーバの応答を毎回待たなければならないため

for document in collection1.find(): 
    field1 = document['field'] 
    search = collection2.find({'field': field1}) 
    # Do some stuff with the search 

しかし、各要素の検索を実行するには、あまりにも多くの時間を要します。

要素ごとの待機時間を短縮するために、一度に500件ずつの文書を使用しようとしています。

私はこれを行う方法を見つけた唯一の方法は、しかし、これは非常にハックように見えるカーソル

cursor = collection1.find() 
while cursor.alive: 
    batch_data = [] 
    for i in range(500): 
      batch_data.append(cursor.next()) 
    fields = [i['field'] for i in bath_data]: 
    search = collection2.find({'field': {"$in": fields}}) 
    # map each result to the correct document and then do my stuff 

のnext()メソッドを使用しています。コレクションの検索を実行し、その結果を所定のサイズのバッチのリストとして返す方法はありますか?

答えて

0

私が正しく理解していれば、フィールド上に2つのコレクションを結合しようとしています。 MongoDB 3.2以降のバージョンを使用している場合は、集約フレームワークで$lookup operatorを試すことができます。これは、リレーショナルデータベースの左外部結合と同じです。しかし、pymongoがそれをサポートしているかどうかはわかりません。もしそれがサポートされていなければ、$ limitと$ skip演算子を使ってすべてのコレクションをメモリにロードすることはできません。 here.

+0

PyMongoは$ lookupをサポートするために何もする必要はなく、指定した演算子に関係なく、集約パイプライン全体をサーバーに渡します。 –

+0

ありがとうございます、私はそれを念頭に置いておきます。 –

関連する問題