繁体   English   中英

MongoDB 聚合 - 查询 collections 满足所有对象数组不至少一个

[英]MongoDB Aggregation - query collections that satisfies all array of objects not at least one

我有 collections 的日期在数组中,例如:

datesArray: [{
 start_date: Date,
 end_date: Date
}]

我只想要那些满足 dateArray 的所有元素的 collections。

我在聚合$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 但没有成功。

谢谢

$map your datesArray按照您的日期范围匹配标准映射到 boolean 数组。 对结果执行$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游乐场供您参考。

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM