在mongoDB中嵌套时使用Braces和在运行聚合查询时使用逻辑运算符的规则是什么?有些查询可以工作,而另一些查询则不工作,如下所示。
方案1(工程): $project:{ $and:[{ $gt:"$qty",100 },{ $lt:"$qty",250 }] }
场景2(作品):$project:{$and:{“数据”:“住宅”},{“状态”:真},}
方案3(工程) $and:[{$and:{“数据”:“住宅”},{“状态”:真},$and:{“数据”:“Lobby”},{“状态”:真},}]
场景3(将给出与场景2结果不同的结果) $and:[{$and:{“数据”:“住宅”},{“状态”:真},},{$and:{“数据”:“Lobby”},{“状态”:真},}]
方案4(工程):
$and:[ { $or:[ { $and:{"data":"Kids"},{"status":true },{ $and:{“数据”:“成人”},{"status":true}]
如果我要做的话,场景4会给出一个不同的结果:
$and:[ { $or:[{$and:{“数据”:“孩子”},{“状态”:真}。$and:{“数据”:“成人”},{“状态”:真}]} ],
这些细节在任何地方的文档中都没有显示。
发布于 2017-07-07 06:10:56
因此,我认识到的一件事是,与$and或$or嵌套的大括号可以作为一个单独的步骤/阶段来处理,这取决于我们如何使用它们。这个概念称为Coalescence,并在聚合管道优化(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将每个大括号作为一个单独的阶段处理,接下来的几个阶段将根据上一阶段的结果进行操作。
https://stackoverflow.com/questions/44952291
复制相似问题