我在模型中有一个 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/