MongoDb逻辑查询运算符和大括号

MongoDb逻辑查询运算符和大括号,mongodb,aggregation-framework,Mongodb,Aggregation Framework,嵌套时使用大括号的规则是什么?运行聚合查询时在mongoDB中使用逻辑运算符的规则是什么?某些查询有效,而其他查询无效,如下所示 情景1(工程): 情景3(工程) 场景3(将给出与场景2不同的结果) 情景4(工程): 如果我要执行以下操作,场景4将给出不同的结果: 在任何地方,文件中均未说明此类详细信息 所以我认识到一件事,就是带$and或$or的嵌套大括号可以视为单独的步骤/阶段,具体取决于我们如何使用它们。这个概念被称为合并,它将在聚合管道优化()中详细讨论。 让我用一个例子来解释更

嵌套时使用大括号的规则是什么?运行聚合查询时在mongoDB中使用逻辑运算符的规则是什么?某些查询有效,而其他查询无效,如下所示

情景1(工程):



情景3(工程)


场景3(将给出与场景2不同的结果)


情景4(工程):

如果我要执行以下操作,场景4将给出不同的结果:


在任何地方,文件中均未说明此类详细信息

所以我认识到一件事,就是带$and或$or的嵌套大括号可以视为单独的步骤/阶段,具体取决于我们如何使用它们。这个概念被称为合并,它将在聚合管道优化()中详细讨论。 让我用一个例子来解释更多

假设x=[1,2,3,5,8,13,21,34,55];我们希望在我们的集合中过滤这些信息。案例一。 我对“先大于后小于”进行了比较,这是有原因的

$project:
 {
  $and: [ { $gt: [ "$qty", 25 ] },{ $lt: [ "$qty", 5 ] }]
 }
我们应该得到8,13,21的结果

接下来,让我们试试这个

$项目:

$and:
[
 {
  $and:[{ $gt: [ "$qty", 25 ] }],                                                                                          
  $and:[{ $lt: [ "$qty", 5 ] }],                                                                                                                            
 }
]
我们应该得到一个8,13,21的结果,原因是它已经消失了,一次就完成了

最后一个例子

$and:
[
  {
    $and:[{ $gt: [ "$qty", 25 ] }],    
  },
  {                                                                                       
    $and:[{ $lt: [ "$qty", 5 ] }],                                                                                                                              
  }
]
结果应该是[]或为空

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


这里的教训是,如果查询的嵌套部分在$and中,$或请注意,每个大括号被视为一个单独的阶段,以下阶段根据前一阶段的结果进行操作。

因此,我意识到,带有$和/或$的嵌套大括号可以视为单独的步骤/阶段,具体取决于我们如何使用它们。这个概念被称为合并,它将在聚合管道优化()中详细讨论。 让我用一个例子来解释更多

假设x=[1,2,3,5,8,13,21,34,55];我们希望在我们的集合中过滤这些信息。案例一。 我对“先大于后小于”进行了比较,这是有原因的

$project:
 {
  $and: [ { $gt: [ "$qty", 25 ] },{ $lt: [ "$qty", 5 ] }]
 }
我们应该得到8,13,21的结果

接下来,让我们试试这个

$项目:

$and:
[
 {
  $and:[{ $gt: [ "$qty", 25 ] }],                                                                                          
  $and:[{ $lt: [ "$qty", 5 ] }],                                                                                                                            
 }
]
我们应该得到一个8,13,21的结果,原因是它已经消失了,一次就完成了

最后一个例子

$and:
[
  {
    $and:[{ $gt: [ "$qty", 25 ] }],    
  },
  {                                                                                       
    $and:[{ $lt: [ "$qty", 5 ] }],                                                                                                                              
  }
]
结果应该是[]或为空

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

因此,这里的教训是,如果您将查询的一部分嵌套在$and$中,或者请注意,每个大括号都被视为一个单独的阶段,下面的阶段将根据前一阶段的结果进行操作

$project:
 {
  $and: [ { $gt: [ "$qty", 25 ] },{ $lt: [ "$qty", 5 ] }]
 }
$and:
[
 {
  $and:[{ $gt: [ "$qty", 25 ] }],                                                                                          
  $and:[{ $lt: [ "$qty", 5 ] }],                                                                                                                            
 }
]
$and:
[
  {
    $and:[{ $gt: [ "$qty", 25 ] }],    
  },
  {                                                                                       
    $and:[{ $lt: [ "$qty", 5 ] }],                                                                                                                              
  }
]