1

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

例如

这是我的文件:

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

这是原始 pymongo 查询的列表(与一些整数列表相关联):

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实例是否与代码中的特定查询匹配,而不是查询数据库(查询列表可以任意长)。

4

2 回答 2

0

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

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

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

  1. 在 Python 中实现 map 阶段(新)并在 Python 中实现 reduce(已经)
  2. 在 JS 中保留 map 阶段并在 JS 中实现 reduce 阶段(新)

Python 中任意 JS 查询的 map 阶段似乎需要做很多工作。

我认为,JS 中的 reduce 阶段要求您在运行时生成 reduce 函数,但这应该不会太难。

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

于 2013-05-27T14:20:34.480 回答
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
于 2013-05-30T07:01:38.167 回答