Wil*_*iam 4 python listfield pymongo mongoengine
我有一个列表列表,像这样:
li = [[('A', 'one'), ('A', 'two')], [('B', 'three'), ('B', 'four')]]
Run Code Online (Sandbox Code Playgroud)
并且我需要查询一个mongo数据库,以获取其列表字段在的每个子列表中至少包含一项的所有对象li。例如:具有[('A','one')OR('A','Two')]和[['B','三个')OR('B','四个')]的项目...
我正在使用mongoengine,但是如果我可以使用其他方法来完成此操作,则可能会更改。所以现在我在做很多这样的查询,以避免重复输入:
final = set()
for sublist in li:
query = Obj.objects(list_field__in=sublist)
final &= set(query)
Run Code Online (Sandbox Code Playgroud)
问题在于,在处理较大的查询结果时,这非常慢(我认为,使该设置花费很长时间)。有什么办法可以加快速度吗?具体来说,有没有一种方法可以避免从查询结果中创建集合/列表?
我真的很想能够以某种方式写这样的东西:
query = Obj.objects(list_field__in=li[0] AND list_field__in=li[1] AND ...)
Run Code Online (Sandbox Code Playgroud)
编辑:下面的答案不适用于进一步的测试,因为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"]]
}}
]})
Run Code Online (Sandbox Code Playgroud)
我可以在mongoengine中做到吗?它不会让我用Q(list_field__in=[('A', 'one'), ('A', 'two')]) | Q(list_field__in=[('B', 'three'), ('B', 'four')])
我认为您可以通过Q课尝试一下:
filter = reduce(Q.__and__, map(lambda x: Q(list_field__in=x), li))
Obj.objects(filter)
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
2040 次 |
| 最近记录: |