在mongoengine中查询列表;包含vs在
问题描述:
我有一个ListField与ids(ReferenceField)模型,我需要做一个查询,如果一个特定的ID是在该列表中。据我所知我对这个2种选择:在mongoengine中查询列表;包含vs在
Model.objects.filter(refs__contains='59633cad9d4bc6543aab2f39')
或:
Model.objects.filter(refs__in=['59633cad9d4bc6543aab2f39'])
哪一个是最有效的这种使用情况?
这个模型看起来像:
class Model(mongoengine.Document):
refs = mongoengine.ListField(mongoengine.ReferenceField(SomeOtherModel))
从我可以在mongoengine文档阅读,http://docs.mongoengine.org/guide/querying.html#string-queries,包含确实是一个查询字符串,但令人惊讶的在这里工作也是如此。但我猜测__in更有效率,因为它应该为列表进行优化,还是我错了?
答
通常在封面下的字符串查询都是正则表达式查询,所以效率会更低。但是,对照参考字段进行测试时例外!以下查询是:
Model.objects.filter(refs__contains="5305c92956c02c3f391fcaba")._query
{'refs': ObjectId('5305c92956c02c3f391fcaba')}
这是一个直接查找。
Model.objects.filter(refs__in=["5305c92956c02c3f391fcaba"])._query
{'refs': {'$in': [ObjectId('5305c92956c02c3f391fcaba')]}}
这可能效率较低,但可能是极其微小的。最大的影响是文档数量以及refs
字段是否有索引。