什么是以下两个MongoDB的查询之间的区别?

问题描述 投票:1回答:3

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

// 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
mongodb
3个回答
2
投票

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

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

被评估相同

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

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

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

1
投票

查询2是impicit(和适当的)建筑物AND condition的方式,查询1是MongoDB中语法方面不正确。它被分析的方法很简单,MongoDB的需要第一condtion,然后用第二个,因此具有相同的含义覆盖它:

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

第一个条件只是被忽略,这就是为什么你得到更多的结果(说明here


0
投票

问题是,蒙戈不解析运营商如果是在引号。 db.events.count({ “startTimeUnix”:{ “$ LT”:1533268800000, “$ GTE”:1533182400000}})表示它看起来对于其中startTimeUnix是一个对象的条目,并包含字段 “$ LT” 和“$ GTE”如果你的下一个命令,这个查询开始返回1:

db.events.insert({"startTimeUnix":{"$lt":1533268800000,"$gte":1533182400000}})
© www.soinside.com 2019 - 2024. All rights reserved.