【问题标题】:MongoDB AND Comparison FailsMongoDB AND 比较失败
【发布时间】:2014-01-16 12:15:36
【问题描述】:

我有一个名为 StudentCollection 的集合,下面给出了两个文档,

> 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 会这样工作?

【问题讨论】:

  • 正如 Kenneth 指出的那样,您只得到一个结果的原因是为您的查询创建的 JavaScript 对象只能有一个 regno 值。您可以通过在 mongo JavaScript shell 中输入:a = {regno: 10, regno2: 20} 然后输入 b = {regno: 10, regno: 20} 来证明这一点。

标签: mysql mongodb


【解决方案1】:

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"] } } );

希望这会有所帮助!

编辑:错字!

【讨论】:

    【解决方案2】:

    MongoDB 将您的查询转换为 Javascript 文档。由于您没有在文档中提及 $and 条件,因此您的查询子句将被最后一个值“regno”:“102”覆盖。因此,您会得到最后一个文档。

    如果您想使用 $and,您可以使用以下任何一种:

    db.studentCollection.find({$and:[{regno:"102"}, {regno:"101"}]});

    db.studentCollection.find({regno:{$gte:"101", $lte:"102"}});

    【讨论】:

      猜你喜欢
      • 2017-11-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-03-04
      • 2011-07-09
      • 1970-01-01
      • 2018-07-21
      相关资源
      最近更新 更多