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")
}
我正在查询包含数万个文档的集合,并且多次查询它。所以,我需要优化查询。
答案 0 :(得分:0)
如果仔细查看第二个查询 -
{'date': {'$gte': datetime(2000, 01, 01)}, 'date': {'$lt': datetime(2016, 11, 23)}}
你应该观察到这是一个具有键date
和date
的对象(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}
将有助于缩小到相关文档。