嵌套时使用大括号和在运行聚合查询时使用mongoDB中的逻辑运算符的规则是什么,有些查询有效,而其他查询不起作用,如下所示?
场景 1(工作(:
$project: { $and: [ { $gt: [ "$qty", 100 ] }, { $lt: [ "$qty", 250 ] }] }
scenario 2 (works): $project: { $and:[{"data":"Residential"},{"status":true}], }
方案 3(工作(
$and: [ { $and:[{"data":"Residential"},{"status":true}], $and:[{"data":"Lobby"},{"status":true}], } ]
方案 3(将给出与方案 2 结果不同的结果(
$and: [ { $and:[{"data":"Residential"},{"status":true}], }, { $and:[{"data":"Lobby"},{"status":true}], } ]
方案 4(工作(:
$and:[ { $or:[ { $and:[ {"data":"Kids"}, {"status":true} ] }, { $and:[ {"data":"Adults"}, {"status":true} ] } ] } ]
如果我这样做,场景 4 会给出不同的结果:
$and:[ { $or: [ { $and:[{"data":"Kids"},{“status":true} ]. $and:[{"data":"Adults"},{"status":true} ] } ] } ],
此类详细信息未在文档中的任何地方注明。
所以我意识到的一件事是,带有 $and 或 $or 的嵌套大括号可以被视为一个单独的步骤/阶段,具体取决于我们如何使用它们。此概念称为聚结,在聚合管道优化 (https://docs.mongodb.com/manual/core/aggregation-pipeline-optimization/#match-match-coalescence( 下详细讨论了它。 让我用一个例子来解释更多。
假设我们有 x = [1,2,3,5,8,13,21,34,55]; 我们希望在我们的聚合中过滤它。案例一。 我先做一个大于然后小于的比较是有原因的。
$project:
{
$and: [ { $gt: [ "$qty", 25 ] },{ $lt: [ "$qty", 5 ] }]
}
我们应该得到 8,13,21 的结果
接下来让我们试试这个
$project:
$and:
[
{
$and:[{ $gt: [ "$qty", 25 ] }],
$and:[{ $lt: [ "$qty", 5 ] }],
}
]
我们应该得到 8,13,21 的结果,原因是它消失了,一口气做这件事
最后一个例子
$and:
[
{
$and:[{ $gt: [ "$qty", 25 ] }],
},
{
$and:[{ $lt: [ "$qty", 5 ] }],
}
]
结果我们应该得到 [] 或空。
结果我们将得到一个空列表的原因是我们将分两个阶段运行上述查询。第一阶段将过滤大于 25 的数字的值x,并将返回一个新列表。然后,下一阶段将继续过滤第一阶段的结果,查找小于 5 的数字,这些数字将为空,因为结果集仅包含大于 25 的数字。
因此,这里的教训是,如果您将查询的部分嵌套在$and中,$or建议将每个大括号视为一个单独的阶段,以下阶段根据前一阶段的结果进行操作。