确定mongoengine文档是否与代码中的原始pymongo查询匹配

时间:2013-05-25 08:35:04

标签: python pymongo mongoengine

假设我有一个pymongo查询列表和一个文档。文档可以(或不)匹配一个或多个pymongo查询。

e.g。

这是我的文件:

> 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])
]

我想知道对于与特定文档匹配的查询的整数列表的连接。在上面的案例中,[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实例是否与代码中的特定查询匹配,而不是查询数据库(查询列表可以任意长。)

2 个答案:

答案 0 :(得分:0)

我认为这可能(或可能不是)是不可能的。

我怀疑mongodb搜索是在服务器中完成的,而您想在客户端验证结果。我怀疑pymongo绑定可以在客户端执行相同的操作。

考虑以下问题的分解:map - 选择与查询匹配的文档和reduce - 连接整数。从根本上说,您获得良好表现的选择是:

  1. 在Python(新)中实现map阶段,在Python中实现reduce(已经)
  2. 在JS中保留地图阶段并在JS(新)中实现reduce阶段
  3. Python中任意JS查询的映射阶段似乎需要做很多工作。

    JS中的

    reduce阶段要求你在运行时生成reduce函数,我想,但这不应该太难。

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

答案 1 :(得分:0)

我敢说你每次都无法逃避查询数据库。但是,添加缓存层可能会显着加快速度。我预先假定相同的查询可能会运行多次。如果没有,缓存根本不适合你。

这是一些示例代码(我建议您使用正确的缓存引擎。代码仅用于说明)

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