1

pymongo クエリとドキュメントのリストがあるとしましょう。ドキュメントは、1 つ以上の pymongo クエリと一致する (または一致しない) 可能性があります。

例えば

ここに私の文書があります:

> db.my_collection.findOne()
{
    "EmbeddedDoc" : {
        "values" : [
            NumberLong(1),
            NumberLong(2)
        ]
    },
    "_id" : ObjectId("515407bbc118555eea07fea5"),
    "some_other_value" : "Val",
    "my_id" : NumberLong(42),
}

生の pymongo クエリのリストを次に示します (int のリストに関連付けられています)。

list_of_queries = [
    ({'EmbeddedDoc.values': 2}, [1, 3, 5]) 
    ({'some_other_value': 'H2G2'}, [6, 5])
    ({'some_other_value': 'Val'}, [10, 4])
    ({'my_id': {'$gte': 256}}, [3, 13, 2])
]

特定のドキュメントに一致するクエリについて、int のリストの連結を知りたいです。上記の場合、それは[1, 3, 5, 10, 4]

これまでに行ったことは、毎回データベースにクエリを実行することでした (ここでMyCollectionは mongoengine の継承に関するメソッドDocument):

def get_list_of_int(self):
    ints = []
    for query, list_of_ints in list_of_queries:
         if bool(MyCollection.objects(my_id=self.my_id, __raw__=query)):
             ints.extend(list_of_ints)
    return ints

ただし、これは毎回データベースにクエリを実行します。これは高速ですが ( にインデックスがあります) 、データベースにクエリを実行する代わりに、インスタンスがコード内の特定のクエリに一致するmy_idかどうかを判断する手段があるかどうか疑問に思っていました(クエリのリストは任意に長くなる可能性があります)。Document

4

2 に答える 2

0

これは不可能かもしれない(または不可能かもしれない)と思います。

クライアントで結果を確認したいときに、サーバーでmongodb検索が行われていると思われます。pymongoバインディングがクライアント側で同じ操作を実行できるとは思えません。

問題の次の分解を検討してください。 --mapクエリに一致するドキュメントを選択し、reduce-- 整数を連結します。基本的に、優れたパフォーマンスを達成するためのオプションは次のとおりです。

  1. Python で map ステージを実装 (新規) し、Python で reduce (既に)
  2. JS でマップ ステージを保持し、JS でリデュース ステージを実装する (新規)

Python での任意の JS クエリの map ステージは、大変な作業のようです。

JS の reduce ステージでは、実行時に reduce 関数を生成する必要があると思いますが、それほど難しくはありません。

http://docs.mongodb.org/manual/core/map-reduce/

于 2013-05-27T14:20:34.480 に答える