【问题标题】:Please explain this mongodb query and its result请解释这个 mongodb 查询及其结果
【发布时间】:2016-10-03 21:28:30
【问题描述】:

查询如下

db.restaurants.find({$and : [{"grades.score" : {$gt:80}},{"grades.score" : {$lt:100}}]})

写这篇文章的初衷是检索得分在 80 到 100 之间的餐厅

为什么此查询在其结果中返回以下文档。以下文档在“大于 80 且小于 100”范围内的等级子文档中没有任何等级元素。

我试过用这个

{
    "_id" : ObjectId("572eb5df1d739cc73c21fab1"),
    "address" : {
            "building" : "65",
            "coord" : [
                    -73.9782725,
                    40.7624022
            ],
            "street" : "West   54 Street",
            "zipcode" : "10019"
    },
    "borough" : "Manhattan",
    "cuisine" : "American ",
    "grades" : [
            {
                    "date" : ISODate("2014-08-22T00:00:00Z"),
                    "grade" : "A",
                    "score" : 11
            },
            {
                    "date" : ISODate("2014-03-28T00:00:00Z"),
                    "grade" : "C",
                    "score" : 131
            },
            {
                    "date" : ISODate("2013-09-25T00:00:00Z"),
                    "grade" : "A",
                    "score" : 11
            },
            {
                    "date" : ISODate("2013-04-08T00:00:00Z"),
                    "grade" : "B",
                    "score" : 25
            },
            {
                    "date" : ISODate("2012-10-15T00:00:00Z"),
                    "grade" : "A",
                    "score" : 11
            },
            {
                    "date" : ISODate("2011-10-19T00:00:00Z"),
                    "grade" : "A",
                    "score" : 13
            }
    ],
    "name" : "Murals On 54/Randolphs'S",
    "restaurant_id" : "40372466"
}

【问题讨论】:

    标签: mongodb


    【解决方案1】:

    发生这种情况是因为这两个条件都为真。当您没有为 grades.score 指定索引时,它会搜索数组的所有元素。它确实找到了带有score > 80(即131)的项目。同时还有其他小于100的物品。

    在人类语言中,您请求“包含分数大于 80 且同时包含分数小于 100 的文档”。您没有指定它应该是满足这些条件的相同分数。

    我猜你正在寻找的是一个同时检查每个元素范围的查询。

    { "grades" : { $elemMatch: { score: { $gt:80, $lt:100 } } } } 
    

    【讨论】:

    • 所以没有办法用简单的 $and 来做到这一点?因为我认为它应该返回同时满足 $and 的文件
    • 正如我已经提到的,您处理的是一个数组。因此,您应该指示 Mongo 遍历数组的所有元素并检查是否有任何项目满足条件。这是由操作员$elemMatch 完成的。我已经用解释编辑了我的答案。希望对你有帮助
    • 哦,我想如果我使用 $ 并且它会将 2 个条件合并为 1。但它会检查两者的有效性。使用 elemMatch 得到正确答案。你能快速回答吗?这可以使用“grades.score”以任何方式完成吗?
    • grade.score 不是一个值。 Mongo 为您扩展它并迭代 grades 数组。你的限制是什么?
    【解决方案2】:

    是的,正如@Kirill Slatin 所说,在这种情况下,您的两个条件都是正确的。因此,对于您所需的结果,请查看以下解决方案并附上解释,以便您更好地理解:

    分别使用 $lte 和 $gte,

    db.products.find({score:{$gt:'80'}})
    
    db.products.find({score:{$lt:'100'}})
    

    第一个语句将返回分数为 80 且大于 80 的结果,第二个语句将返回分数为 100 且小于 100 的结果

    同时使用 $lt 和 $gt

    db.products.find({score:{$gt:80,$lt:100}})
    

    上面的Query会返回大于80小于100的分数结果

    【讨论】:

    • 您在哪里同时使用 gt 和 lt。不应该只返回分值在 80 到 100 之间的文档吗?
    • 是的,当然......这是一个例子,您可以根据需要修改值。
    • 但它没有。这个 db.restaurants.find({"grades.score":{$gt:80,$lt:100}}) 给了我一份文件(问题中提到),其中没有一个分数在 80 和 100 之间。
    • 你得到的结果分数是多少
    • 我已将其粘贴到问题中。看成绩
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-07-12
    • 1970-01-01
    • 2011-07-31
    • 1970-01-01
    • 2013-07-15
    • 2015-04-19
    相关资源
    最近更新 更多