【问题标题】:Querying single field multiple times execution speed in mongodb using pymongo使用pymongo在mongodb中多次查询单个字段的执行速度
【发布时间】:2016-11-24 03:55:49
【问题描述】:

pymongo中两个查询的执行时间是否有差异:

db.collection.find({'date': {'$gte': datetime(2000, 01, 01), '$lt': datetime(2016, 11, 23)}})

db.collection.find({'date': {'$gte': datetime(2000, 01, 01)}, 'date': {'$lt': datetime(2016, 11, 23)}})

在第二种情况下,我查询同一个字段两次。我使用 mongo shell 检查并运行 .explain("executionStats"),唯一的区别是查询 ("queryPlanner.parsedQuery") 第一个是:

"$and" : [
    {
        "date" : {
            "$lt" : ISODate("2016-11-23T00:00:00Z")
        }
    },
    {
        "date" : {
            "$gte" : ISODate("2000-01-01T00:00:00Z")
        }
    }
]

这是第二个:

"date" : {
    "$lt" : ISODate("2016-11-23T00:00:00Z")
}

我正在查询一个包含数万个文档的集合,并且被多次查询。所以,我需要优化查询。

【问题讨论】:

  • “日期”字段是否被索引?如果没有,那应该是提高操作速度的第一步。如果是,两个解释计划在如何应用索引界限之间是否有任何区别?您可能需要再次运行 .explain 并传递 'true' 选项,例如".explain(true)"
  • 嘿,我正在查询集合中的多个字段(大约 6 个),索引日期并没有多大帮助。但是date 字段有一个范围,所有其他字段只匹配值相等。所以,我认为@hyades 的回答解释了我的查询实际上是错误的,并且两个查询不等价,因为我们不能为映射类型(在本例中为 python 字典)中的两个不同值拥有相同的键。

标签: mongodb pymongo


【解决方案1】:

如果您仔细查看第二个查询 -

{'date': {'$gte': datetime(2000, 01, 01)}, 'date': {'$lt': datetime(2016, 11, 23)}}

您应该观察到这是一个对象(python 中的 dict),具有键 datedate,这当然没有意义。您正在尝试创建具有相同键的对象。因此,其中只有一个是有效的(在这种情况下是第二个)。因此,对 mongo 的查询是 {date': {'$lt': datetime(2016, 11, 23)}},它不会为您提供所需的输出。

我建议您应该尽可能清楚地根据逻辑运算符定义查询。在这种情况下,这将是explain 阶段的输出。所以用$and表示两个不同的条件应该是最好的查询方式。

{"$and" : [
    {"date" : {"$lt" : ISODate("2016-11-23T00:00:00Z")}},
    {"date" : {"$gte" : ISODate("2000-01-01T00:00:00Z")}}
]}

谈到如何使查询更快的话题,您应该使用date 上的索引。将此索引定义为单独的索引{date: 1} 将有助于缩小到相关文档。

【讨论】:

    猜你喜欢
    • 2018-06-24
    • 2016-02-06
    • 1970-01-01
    • 1970-01-01
    • 2019-03-25
    • 2016-05-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多