【问题标题】:MongoDB Aggregation - query collections that satisfies all array of objects not at least oneMongoDB 聚合 - 满足所有对象数组而不是至少一个的查询集合
【发布时间】: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"),}

标签: javascript node.js mongodb mongoose mongodb-query


【解决方案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")}}
      ]
  }}
])

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-07-27
    • 2015-06-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-08-13
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多