python - 在mongoengine中查询列表;包含与在

标签 python mongodb mongoengine

我在模型中有一个 ListField,带有 ids (ReferenceField),我需要查询某个 id 是否在该列表中。据我所知,我有 2 个选择:

Model.objects.filter(refs__contains='59633cad9d4bc6543aab2f39')

或:

Model.objects.filter(refs__in=['59633cad9d4bc6543aab2f39'])

对于这个用例,哪个最有效?

模型看起来像:

class Model(mongoengine.Document):
    refs = mongoengine.ListField(mongoengine.ReferenceField(SomeOtherModel))

从我在 mongoengine 中读到的 documentation , contains 实际上是一个字符串查询,但它在这里的效果也令人惊讶。但我猜测 __in 效率更高,因为它应该针对列表进行优化,或者我错了吗?

最佳答案

通常在幕后的字符串查询都是正则表达式查询,因此效率较低。但是,在针对引用字段进行测试时除外!以下查询是:

Model.objects.filter(refs__contains="5305c92956c02c3f391fcaba")._query
{'refs': ObjectId('5305c92956c02c3f391fcaba')}

这是直接查找。

Model.objects.filter(refs__in=["5305c92956c02c3f391fcaba"])._query
{'refs': {'$in': [ObjectId('5305c92956c02c3f391fcaba')]}}

这可能效率较低,但可能会非常边缘。最大的影响是文档的数量以及 refs 字段是否有索引。

关于python - 在mongoengine中查询列表;包含与在,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21888096/

相关文章:

django - Mongoengine FileField 保存到磁盘?

python - 如何从 json 更新 Mongoengine DynamicDocument

node.js - 我应该在每个模型保存后关闭 Mongoose 连接吗?

mongodb - 如何在 MongoDB C# 驱动程序中使用 SafeMode

python - 如何使用python检查某些进程是否在任务管理器中运行

python - 安装ghost.py时出错

node.js - 来自 NodeJS 或 mongoose 的 mongodump/mongorestore

python - Mongoengine 信号监听所有模型

具有动态模型名称的 Python/Django 应用程序(应用程序重用)

python - pytest --help 在 conftest.py 中使用 pytest_configure() 时不运行