2014-02-19 60 views
4

我有一個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更有效率,因爲它應該爲列表進行優化,還是我錯了?

回答

7

通常在封面下的字符串查詢都是正則表達式查詢,所以效率會更低。但是,對照參考字段進行測試時例外!以下查詢是:

Model.objects.filter(refs__contains="5305c92956c02c3f391fcaba")._query 
{'refs': ObjectId('5305c92956c02c3f391fcaba')} 

這是一個直接查找。

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

這可能效率較低,但可能是極其微小的。最大的影響是文檔數量以及refs字段是否有索引。