鉴于
具有这种结构的产品集合:
{
product: "Super Duper-o-phonic",
price: 100000000000,
reviews: [
{
user: "fred",
comment: "Great!",
rating: 5
},
{
user: "tom",
comment: "I agree with Fred, somewhat!",
rating: 4
}
]
};
需要
查找价格超过10,000且评分为5或更高的所有产品。
这是我的解决方案(不正确):
db.catalog.find({
$and: [
{
price: {
$gt: 10000
}
},
{
"reviews.rating": {
$gte: 5
}
}
]
});
这是正确的解决方案:
db.catalog.find({
"price": {
"$gt": 10000
},
"reviews.rating": {
"$gte": 5
}
});
我的解决方案和正确的解决方案之间存在什么差异?
答案 0 :(得分:2)
MongoDB在指定逗号分隔的表达式列表时提供隐式AND操作。当必须在多个表达式中指定相同的字段或运算符时,必须使用带有$和运算符的显式AND。
因此,在您的情况下,两个查询在功能上是相同的;但是,显式的$and
运算符是不必要的。除非您需要,否则通常会将其遗漏。
答案 1 :(得分:2)
这两个查询应该做同样的事情,他们在我的几个测试中做了。另一方面,第二个更紧凑,因为当你只使用逗号时$and是隐含的。
正如您在评论中澄清的那样,您认为第一个查询错误的原因是它在MongoDB大学上被标记为错误。我想你应该在他们的论坛上问一下。
你的解决方案有效,读起来并不好。