MongoDB和比较失败

时间:2014-01-16 12:15:36

标签: mysql mongodb

我有一个名为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会这样工作吗?

2 个答案:

答案 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”}});