我有一个列表列表,如下所示:
li = [[('A', 'one'), ('A', 'two')], [('B', 'three'), ('B', 'four')]]
我需要查询mongo数据库以获取其列表字段在li
的每个子列表中至少包含一个项目的所有对象。例如:具有[('A','one')OR('A','two')]和[('B','three')OR('B','four')]的项目...
我正在使用mongoengine,但如果我可以使用别的东西来完成这项工作,那么这可能会改变。所以现在我正在做很多这样的查询,以避免重复输入:
final = set()
for sublist in li:
query = Obj.objects(list_field__in=sublist)
final &= set(query)
问题在于,在处理大型查询结果时这非常慢(我相信这需要花费很长时间)。有没有办法让我加快速度?具体来说,有没有办法可以避免从查询结果中创建集/列表?
我真的希望能够以某种方式写出这样的东西:
query = Obj.objects(list_field__in=li[0] AND list_field__in=li[1] AND ...)
编辑:以下答案在进一步测试时无效,因为mongoengine不允许Q(field=x) & Q(field=y)
Edit2:这是我想要做的等效的mongoDB查询:
db.obj.find({ "$and": [
{"list_field": {"$in":
[["A", "one"], ["A", "two"]]
}},
{"list_field": {"$in":
[["B", "three"], ["B", "four"]]
}}
]})
我可以在mongoengine中这样做吗?它不允许我使用Q(list_field__in=[('A', 'one'), ('A', 'two')]) | Q(list_field__in=[('B', 'three'), ('B', 'four')])
答案 0 :(得分:4)
我认为你可以尝试through the Q class:
filter = reduce(Q.__and__, map(lambda x: Q(list_field__in=x), li))
Obj.objects(filter)