请解释一下这个mongodb查询及其结果

时间:2016-06-03 17:56:43

标签: mongodb

查询如下

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"
}

2 个答案:

答案 0 :(得分:2)

这是因为两种情况都属实。如果您没有为{{1}}指定索引,则会搜索数组的所有元素。并且确实找到{{1}}的项目(即131)。同时存在少于100的其他项目。

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

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

{{1}}

答案 1 :(得分:0)

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

分别使用$ lte和$ gte,

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

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

第一个语句将返回结果,得分为80,gretaer超过80,Second语句将返回得分结果为100且小于100

一起使用$ lt和$ gt

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

上述查询将返回大于80且小于100的分数结果