Python - Mongoengine 高级查询列表字段

标签 python pymongo mongoengine listfield

我有一个列表列表,像这样:

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', '三'), ('B', '四')])

最佳答案

我觉得你可以试试through the Q class :

  filter = reduce(Q.__and__, map(lambda x: Q(list_field__in=x), li))
  Obj.objects(filter)

关于Python - Mongoengine 高级查询列表字段,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14564420/

相关文章:

python - 使用 Python 解析 LLDP 输出

python - 如何在 Python 中退出 Thrift 服务器

javascript - MongoDB 中的多个 $where 查询

python - 错误 : "Document BlogPost may not be subclassed" mongoengine

python - 排序列表的反向索引

python - 使用 python 将多个 JSON 文件插入 MongoDB

python - Mongo 边界框查询(带限制)

django - 如何记录pymongo查询?

python - 将 mongoengine.connect 从 django 中的 setting.py 中取出

python - 带有 django-rest-framework 的 mongo 支持模型的可浏览 REST api