有人可以在两次查询后告诉我b / w的区别。两者都适合我,似乎给出了正确的结果,但我不确定是否确实存在任何差异
检索所有分数在80到95之间的学生
var query1 = { 'grade' : {"$gt":80}, 'grade' : {"$lt":95} };
var query2 = { 'grade' : {"$gt":80,"$lt":95} };
答案 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 } },
]})
真正的目的是在同一领域结合不同的条件。
但是,对于您的情况,请使用您指定的第二个表单。