首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >MongoDb逻辑查询运算符与Braces

MongoDb逻辑查询运算符与Braces
EN

Stack Overflow用户
提问于 2017-07-06 14:50:16
回答 1查看 88关注 0票数 2

在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:{“数据”:“成人”},{“状态”:真}]} ],

这些细节在任何地方的文档中都没有显示。

EN

回答 1

Stack Overflow用户

发布于 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;我们想在我们的集合中过滤。一号案件。我做了一个比较,首先大于,然后更少,因为一个原因。

代码语言:javascript
复制
$project:
 {
  $and: [ { $gt: [ "$qty", 25 ] },{ $lt: [ "$qty", 5 ] }]
 }

我们应该得到8,13,21的结果

接下来让我们试试这个

$project:

代码语言:javascript
复制
$and:
[
 {
  $and:[{ $gt: [ "$qty", 25 ] }],                                                                                          
  $and:[{ $lt: [ "$qty", 5 ] }],                                                                                                                            
 }
]

我们应该得到一个8,13,21的结果--原因是它消失了--一蹴而就

最后一个例子

代码语言:javascript
复制
$and:
[
  {
    $and:[{ $gt: [ "$qty", 25 ] }],    
  },
  {                                                                                       
    $and:[{ $lt: [ "$qty", 5 ] }],                                                                                                                              
  }
]

因此,我们应该得到[]或空的。

因此,我们将得到一个空列表,这是因为我们将分两个阶段运行上述查询。第一阶段将过滤大于25的值x,并返回一个新列表。然后,下一阶段将继续对小于5的数字过滤第一阶段的结果,因为结果集只包含大于25的数字。

因此,这里的教训是,如果您在$and中嵌套了查询的部分,那么建议$or将每个大括号作为一个单独的阶段处理,接下来的几个阶段将根据上一阶段的结果进行操作。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/44952291

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档