在MongoDB中使用两个日期比较而不是日期范围查询会得到不同的结果

在MongoDB中使用两个日期比较而不是日期范围查询会得到不同的结果,mongodb,mongodb-query,Mongodb,Mongodb Query,对于这样的对象: { "status" : 1, "date" : ISODate("2014-02-13T13:00:31.233Z") } 为什么这个范围查询 db.collection.find({ "status": 1, "date": { $lte: ISODate("2015-06-16T20:05:03.000Z"), $gte: ISODate("2015-06-15T20:05:03.000Z") } }); 给出正

对于这样的对象:

{
    "status" : 1,
    "date" : ISODate("2014-02-13T13:00:31.233Z")
}
为什么这个范围查询

db.collection.find({
    "status": 1,
    "date": {
    $lte: ISODate("2015-06-16T20:05:03.000Z"),
    $gte: ISODate("2015-06-15T20:05:03.000Z")
    }
});
给出正确的结果,而这两个日期比较给出不同的结果:

db.collection.find({
    "status": 1,
    "date": {
    $lte: ISODate("2015-06-16T20:05:03.000Z")
    },
    "date": {
    $gte: ISODate("2015-06-15T20:05:03.000Z")
    }
});
看起来最后一个查询实际上以日期比较之间的OR结束,而不是像我预期的那样。

find({“status”:1,“date”:{$lte:ISODate(“2015-06-16T20:05:03.000Z”),“date”:{$gte:ISODate(“2015-06-15T20:05:03.000Z”)}

在这里,您试图查找日期(键)小于2015-06-16T20:05:03.000Z,在同一查询中,您正在将日期(键)与2015-06-15T20:05:03.000Z相加。 您只有一个键作为日期


上述查询的行为类似于select*from表,其中date>=2015-06-15T20:05:03.000Z和date,原因不一样,因为您打破了同样适用于JavaScript对象的“哈希/映射”结构的一般规则。该规则规定“键”只能指定一次

因此,当你写:

db.collection.find({
“地位”:1,
“日期”:{
“$lte”:ISODate(“2015-06-16T20:05:03.000Z”)
},
//下一个相同的键将覆盖另一个键
“日期”:{
“$gte”:ISODate(“2015-06-15T20:05:03.000Z”)
}
});
其中一个
“日期”
项被“忽略”,因为每个级别只能有一个。因此,实际上,“小于”或“大于”都被当作一个条件扔掉了(很可能是“小于”,因为它是第一个),所有文档都只针对一个条件进行测试

这是一个很好的例子。考虑这些文件:

{“a”:1},
{“a”:2},
{“a”:3},
{“a”:4}
发出此查询时:

db.collection.find({“a”:{“$gte”:2},“a”:{“$lte”:3},{“\u id”:0})
结果仅与“第二个”条件匹配,因为该键重写了“第一个”。它显然违反了“第一”条件,因此表明它已被“丢弃”:

{“a”:1}
{“a”:2},
{“a”:3},
因此,为了使两个条件都得到应用,您可以像前面一样指定:

db.collection.find({
“地位”:1,
“日期”:{
“$lte”:ISODate(“2015-06-16T20:05:03.000Z”),
“$gte”:ISODate(“2015-06-15T20:05:03.000Z”)
}
});
这基本上是写这篇文章的“速记”:

db.collection.find({
“地位”:1,
“$and”:[
{“日期”:{
“$lte”:ISODate(“2015-06-16T20:05:03.000Z”)
}},
{“日期”:{
“$gte”:ISODate(“2015-06-15T20:05:03.000Z”)
}}
]
});

这是允许的,因为每个元素都在它自己的文档中,并且是数组的一个成员。这里的分隔允许您在每个元素中使用相同的键名。

这不是很准确的描述。仔细查看查询的文档结构,看看这里有什么错误。提示:关于“键”和名称的唯一性。检查有什么。然后提供评论。谢谢。我确实阅读了你提供的内容,但没有解释两个查询不同的原因。我试图给你一个提示,让你可以改变你的答案,但你似乎忽视了这一点或误解了。回答很好,但也很可怕:)这可能是一个很难发现的常见错误。