在mongoengine中查询列表;包含vs在

在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字段是否有索引。