我跑了两个查询,他们返回了不同的结果。
// 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
答案 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}})