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

3

我有一些包含日期的数组集合,例如:

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,但它至少匹配一个数组元素。 我还尝试了$all$elemMatch,但没有成功。
谢谢

尝试像这样: {"$gte" : ISODate("2021-01-11T00:00:00Z"),} - Souren Ghosh
2个回答

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


0
你可以简单地反转每个条件并使用$nor
db.collection.aggregate([
  {$match: {
      $nor: [
        {"datesArray.start_date": {$lt: ISODate("2021-11-01")}},
        {"datesArray.end_date": {$gt: ISODate("2021-11-30")}}
      ]
  }}
])

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接