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更有效率,因为它应该针对列表进行优化,或者我错了?
通常在封面下的字符串查询都是正则表达式查询,因此效率较低.但是,例外情况是针对参考字段进行测试时!以下查询是:
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字段是否具有索引.