查询mongoengine中的列表; 包含vs in

Nik*_*as9 4 python mongodb mongoengine

我在带有id(ReferenceField)的模型中有一个ListField,如果某个id在该列表中,我需要进行查询.AFAIK我有两种选择:

Model.objects.filter(refs__contains='59633cad9d4bc6543aab2f39')
Run Code Online (Sandbox Code Playgroud)

要么:

Model.objects.filter(refs__in=['59633cad9d4bc6543aab2f39'])
Run Code Online (Sandbox Code Playgroud)

哪一个对这个用例最有效?

该模型看起来像:

class Model(mongoengine.Document):
    refs = mongoengine.ListField(mongoengine.ReferenceField(SomeOtherModel))
Run Code Online (Sandbox Code Playgroud)

从我在mongoengine文档中可以看到的,http: //docs.mongoengine.org/guide/querying.html#string-queries,contains 实际上是一个字符串查询,但它在这里也令人惊讶地工作.但我猜__in更有效率,因为它应该针对列表进行优化,或者我错了?

Ros*_*oss 8

通常在封面下的字符串查询都是正则表达式查询,因此效率较低.但是,例外情况是针对参考字段进行测试时!以下查询是:

Model.objects.filter(refs__contains="5305c92956c02c3f391fcaba")._query
{'refs': ObjectId('5305c92956c02c3f391fcaba')}
Run Code Online (Sandbox Code Playgroud)

这是直接查找.

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

这可能效率较低,但可能非常有限.最大的影响将是文档的数量以及该refs字段是否具有索引.