在 Mongo Aggregation 中获取 ElemMatch 以查找 null 或不存在的数组对象

Posted

技术标签:

【中文标题】在 Mongo Aggregation 中获取 ElemMatch 以查找 null 或不存在的数组对象【英文标题】:Get ElemMatch in Mongo Aggregation to find null or non existing array objects 【发布时间】:2022-01-21 21:57:57 【问题描述】:

假设我在 Mongo 4.2 中有如下数据。 请注意,每个文档都由一个 RESULT 数组组成,该数组可能包含一个或多个或 null 子对象。

 "_id" : 1, "results" : [  "product" : "a", "score" : "1" ,
                            "product" : "b", "score" : "5"  ] 

 "_id" : 2, "results" : [  "product" : "a", "score" : "8" ,
                            "product" : "b", "score" : "7"  ] 

 "_id" : 3, "results" : [  "product" : "a", "score" : "" ,
                            "product" : "b", "score" :   ] 

 "_id" : 4, "results" : [  "product" : "b", "score" : "8"  ] 

 "_id" : 5, "results" : [  ] 

我现在正在尝试使用 ElemMatch 获取聚合管道,以查找所有具有产品“A”且得分大于“”的文档。 那个有效,我现在正在使用它:

 "results":  $elemMatch:  "product": "a", "score":   $gt : ''   

但是我无法设法得到它,就像所有没有产品 A 得分的文档一样。这意味着我希望从上面的示例文档中获得 Doc #3 和 #4 和 #5。

我可以用这个得到#3:

 "results":  $elemMatch:  "product": "a", "score":  ''   

还有#5:

  "results.score": null 

但我无法获得#4。 当然,最好只用一个查询来获得 Doc #3 和 #4 和 #5。 那么有没有办法做到这一点?

感谢您的帮助。

【问题讨论】:

【参考方案1】:

...最好只用一个获得 Doc #3 和 #4 和 #5 查询

您可以使用此查询过滤器:

db.collection.aggregate([
   
    $match: 
      results:  
        $not:  
          $elemMatch:  product: "a", score:  $nin: [ null, "" ]   
         
      
    
  
])

【讨论】:

以上是关于在 Mongo Aggregation 中获取 ElemMatch 以查找 null 或不存在的数组对象的主要内容,如果未能解决你的问题,请参考以下文章

开发中使用mongoTemplate进行Aggregation聚合查询

mongodb Aggregation聚合操作之$facet

mongodb Aggregation聚合操作之$sort

mongodb Aggregation聚合操作之$bucket

mongodb 语句和SQL语句对应(SQL to Aggregation Mapping Chart)

在提供的多个日期范围之间获取 mongo 结果