查询如下
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"
}
答案 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的分数结果