Mongodb查询区别

时间:2014-04-06 02:37:10

标签: mongodb mongodb-query

有人可以在两次查询后告诉我b / w的区别。两者都适合我,似乎给出了正确的结果,但我不确定是否确实存在任何差异

检索所有分数在80到95之间的学生

     var query1 = { 'grade' : {"$gt":80}, 'grade' : {"$lt":95} };

     var query2 = { 'grade' : {"$gt":80,"$lt":95} };     

2 个答案:

答案 0 :(得分:0)

您应该使用第二个查询,原因如下:查询实际上是一个JSON。在第一个查询中,您提供了一个重复键(grade)。

尽管如此,他们仍被JSON RFC所允许,但即使道格·克罗克福德也提到他遗憾地将这种模糊性留在规范中,因为它不可避免地导致各种混乱。

也许Mongo现在正确地解析它(或者可能是你的情况),但是你不知道这种方式会持续多长时间(而其他一些json解析器告诉你你有错误)。

因此,最好的方法是将第一个查询视为错误并仅使用第二个查询。

答案 1 :(得分:0)

我认为您会发现您的第一个表单实际上并不起作用,即使它是在最小样本上为您完成的。而且它会因为一个很好的理由而失败。请考虑以下文件:

{ "grade" : 90 }
{ "grade" : 96 }
{ "grade" : 80 }

如果您发出第一个查询表格,您将获得结果:

{ "grade" : 90 }
{ "grade" : 80 }

原因是你不能在这样的文件中使用“相同的密钥”,而另一个则会否定另一个。在这种情况下,“右”侧键优先于左键并覆盖。这是散列或字典结构的常见行为。

这就是为什么第二种形式是必需的,并且当然只会返回与要指定的条件匹配的文档。

如果您有实际案例使用相同的字段并且可能使用不同的条件,则可以使用$and运算符。不是最好的例子,只是为了澄清:

db.collection.find({ "$and": [
     { "grade": { "$gt": 80 } },
     { "grade": { "$lt": 95 } },
]})

真正的目的是在同一领域结合不同的条件。

但是,对于您的情况,请使用您指定的第二个表单。