MongoDB 聚合 - 满足所有对象数组而不是至少一个的查询集合

Posted

技术标签:

【中文标题】MongoDB 聚合 - 满足所有对象数组而不是至少一个的查询集合【英文标题】:MongoDB Aggregation - query collections that satisfies all array of objects not at least one 【发布时间】:2022-01-18 22:17:22 【问题描述】:

我的集合在数组中包含日期,例如:

datesArray: [
 start_date: Date,
 end_date: Date
]

我只想要那些满足 datesArray 的所有元素的集合。

我在聚合 $match 运算符中使用它,例如:

Model.aggregate([

  $match: 
   'datesArray.start_date':  $gte: new Date('11-01-21') ,
   'datesArray.end_date':  $lte: new Date('11-30-21') 
  

])

我尝试使用 $elemMatch,但它至少匹配一个数组元素。 我也用 $elemMatch 尝试了 $all,但没有成功。

谢谢

【问题讨论】:

试试这样 "$gte" : ISODate("2021-01-11T00:00:00Z"), 【参考方案1】:

$map 您的 datesArray 根据您的日期范围匹配条件转换为布尔数组。对结果执行$allElementsTrue 以获得您想要的结果。

inputDate1inputDate2 是您的输入。随时更新它们。

db.collection.aggregate([
  
    "$addFields": 
      "inputDate1": ISODate("2021-01-01"),
      "inputDate2": ISODate("2021-12-31")
    
  ,
  
    "$match": 
      $expr: 
        "$allElementsTrue": [
          
            "$map": 
              "input": "$datesArray",
              "as": "d",
              "in": 
                $and: [
                  
                    $gte: [
                      "$$d.start_date",
                      "$inputDate1"
                    ]
                  ,
                  
                    $lte: [
                      "$$d.end_date",
                      "$inputDate2"
                    ]
                  
                ]
              
            
          
        ]
      
    
  
])

这是Mongo playground 供您参考。

【讨论】:

成功了。谢谢!【参考方案2】:

您可以简单地反转每个标准并使用$nor

db.collection.aggregate([
  $match: 
      $nor: [
        "datesArray.start_date": $lt: ISODate("2021-11-01"),
        "datesArray.end_date": $gt: ISODate("2021-11-30")
      ]
  
])

【讨论】:

以上是关于MongoDB 聚合 - 满足所有对象数组而不是至少一个的查询集合的主要内容,如果未能解决你的问题,请参考以下文章

如何在 mongodb 聚合中展开嵌套对象数组?

MongoDB聚合查询 - 返回嵌套子文档中的所有项目

如何使用 MongoDB 聚合 `$lookup` 作为 `findOne()`

在mongodb聚合中将多个对象合并为一个对象

如何过滤mongodb聚合中的主数组

MongoDB聚合对象数组