假设我有一个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
实例是否与代码中的特定查询匹配,而不是查询数据库(查询列表可以任意长。)
答案 0 :(得分:0)
我认为这可能(或可能不是)是不可能的。
我怀疑mongodb搜索是在服务器中完成的,而您想在客户端验证结果。我怀疑pymongo绑定可以在客户端执行相同的操作。
考虑以下问题的分解:map
- 选择与查询匹配的文档和reduce
- 连接整数。从根本上说,您获得良好表现的选择是:
Python中任意JS查询的映射阶段似乎需要做很多工作。
JS中的reduce阶段要求你在运行时生成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