以下两个mongodb查询之间有什么区别?

时间:2019-02-04 14:58:28

标签: mongodb

我跑了两个查询,他们返回了不同的结果。

// my query 1
> db.events.count({"startTimeUnix":{$lt:1533268800000},"startTimeUnix":{$gte:1533182400000}})
131
// existing app query 2
> db.events.count({"startTimeUnix":{"$lt":1533268800000,"$gte":1533182400000}})
0

查询2已在批处理应用程序中使用,但报告减少了我从这些查询中确认的记录。

//these counts are confusing
> db.events.count()
2781
> db.events.count({"startTimeUnix":{$lt:1533268800000}})
361
> db.events.count({"startTimeUnix":{$gte:1533182400000}})
2780

3 个答案:

答案 0 :(得分:2)

使用第二个查询。您可以添加explain()来查找查询计划。第一个查询

'properties': {'icon': 'circle', 'iconstyle': {'color': 'green'}

的评估结果与

相同
db.events.count({"startTimeUnix":{$lt:1533268800000},"startTimeUnix":{$gte:1533182400000}})

使用下面的命令查看查询计划。

db.events.explain().count({"startTimeUnix":{$gte:1533182400000}})

答案 1 :(得分:1)

查询2是一种构建AND condition的隐式方式,而查询1就MongoDB语法而言是不正确的。它的分析方法非常简单,MongoDB会先进行条件处理,然后再用第二种方法进行覆盖,因此它的含义与以下内容相同:

db.events.count({"startTimeUnix":{$gte:1533182400000}})

第一个条件只是被忽略,这就是为什么您获得更多结果(描述为here

答案 2 :(得分:0)

问题在于,如果在引号中,mongo不会解析运算符。 db.events.count({“ startTimeUnix”:{“ $ lt”:1533268800000,“ $ gte”:1533182400000}}) 表示它将查找startTimeUnix是对象的条目,并包含字段“ $ lt”和“ $ gte” 如果您要执行下一个命令,此查询将开始返回1:

db.events.insert({"startTimeUnix":{"$lt":1533268800000,"$gte":1533182400000}})