使用pymongo

时间:2016-11-23 17:46:00

标签: mongodb pymongo

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"),其中第一个是:{/ p>

"$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")
}

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

1 个答案:

答案 0 :(得分:0)

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

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

你应该观察到这是一个具有键datedate的对象(python中的dict),这当然没有意义。您正在尝试使用相同的键创建对象。因此,只有其中一个有效(在这种情况下是第二个)。因此,对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}将有助于缩小到相关文档。