【问题标题】:Querying a list in mongoengine; contains vs in在 mongoengine 中查询列表;包含与在
【发布时间】:2014-02-19 17:37:14
【问题描述】:

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

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 中可以读到的内容来看,contains 实际上是一个字符串查询,但它在这里也能出人意料地工作。但我猜 __in 效率更高,因为它应该针对列表进行优化,还是我错了?

【问题讨论】:

    标签: python mongodb mongoengine


    【解决方案1】:

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

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

    这是直接查找。

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

    这可能效率较低,但可能非常边缘。最大的影响是文档的数量以及refs 字段是否有索引。

    【讨论】:

      猜你喜欢
      • 2012-10-01
      • 1970-01-01
      • 1970-01-01
      • 2016-08-02
      • 1970-01-01
      • 1970-01-01
      • 2019-05-05
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多