我有一个名为StudentCollection的Collection,下面给出了两个文档,
> db.studentCollection.find().pretty()
{
"_id" : ObjectId("52d7c0c744b4dd77efe93df7"),
"regno" : 101,
"name" : "Ajeesh",
"gender" : "Male",
"docs" : [
"voterid",
"passport",
"drivinglic"
]
}
{
"_id" : ObjectId("52d7c6a144b4dd77efe93df8"),
"regno" : 102,
"name" : "Sathish",
"gender" : "Male",
"dob" : ISODate("2013-12-09T21:05:00Z")
}
为什么以下查询在不符合我在find命令中给出的条件时返回文档。我知道这是一个坏的& AND 比较的愚蠢查询。我尝试使用MySQL并且它没有按预期返回任何内容,但为什么NOSQL会产生问题。我希望它正在考虑最后一个领域进行比较。
> db.studentCollection.find({regno:101,regno:102}).pretty()
{
"_id" : ObjectId("52d7c6a144b4dd77efe93df8"),
"regno" : 102,
"name" : "Sathish",
"gender" : "Male",
"dob" : ISODate("2013-12-09T21:05:00Z")
}
有人可以解释为什么Mongodb会这样工作吗?
答案 0 :(得分:4)
MongoDB利用JSON / BSON,名称应该是唯一的(http://www.ietf.org/rfc/rfc4627.txt @ 2.2。)在另一篇帖子How to generate a JSON object dynamically with duplicate keys?中找到了。我猜测'regno'的值在你的情况下会被覆盖为'102'。
如果您想要的是OR查询,请尝试以下操作:
db.studentCollection.find ( { $or : [ { "regno" : "101" }, {"regno":"102"} ] } );
甚至更好,使用$ in:
db.studentCollection.find ( { "regno" : { $in: ["101", "102"] } } );
希望这有帮助!
编辑:错字!
答案 1 :(得分:0)
MongoDB将您的查询转换为Javascript文档。由于您没有在文档中提及$和condition的任何内容,因此查询子句将被最后一个值“regno”:“102”覆盖。因此,您将获得最后一个文档。
如果您想使用$和,您可以使用以下任何一种方法:
db.studentCollection.find({$ and:[{regno:“102”},{regno:“101”}]});
db.studentCollection.find({regno:{$ gte:“101”,$ lte:“102”}});