在聚合mongodb中按月对日期范围进行分组

时间:2021-04-22 16:08:00

标签: mongodb mongodb-query

考虑以下示例,MongoDB 中的一系列文档:

[
    {
        "_id" : ObjectId("608142d41165f010faf11781"),
        "title" : "Event 1",
        "startDate" : ISODate("2020-11-25T21:00:00.000Z"),
        "endDate" : ISODate("2020-11-27T21:00:00.000Z")
    },
    {
        "_id" : ObjectId("608142df1165f010faf11782"),
        "title" : "Event 2",
        "startDate" : ISODate("2020-11-28T21:00:00.000Z"),
        "endDate" : ISODate("2020-12-03T21:00:00.000Z")
    },
    {
        "_id" : ObjectId("608142e61165f010faf11783"),
        "title" : "Event 3",
        "startDate" : ISODate("2020-12-14T21:00:00.000Z"),
        "endDate" : ISODate("2020-17-28T21:00:00.000Z")
    }
]

有些事件以月份开始并以同一月份结束。

开始日期:2020-11-25

结束日期:2020-11-27

另一方面,有些事件以一个月开始,以另一个月结束。例如:

开始日期:2020-11-28

结束日期:2020-12-03

我正在寻找的结果是按月和年对事件进行分组。如果事件以一个月开始并以另一个月结束,则它将分为开始月份和结束月份。

分组后,我需要得到一个如下所示的结果集:

{
    "_id": {
        "month": 11,
        "year": 2020
    },
    "events": [
        {
            "title": "Event 1"
        },
        {
            "title": "Event 2"
        }
    ]
},
{
    "_id": {
        "month": 12,
        "year": 2020
    },
    "events": [
        {
            "title": "Event 2"
        },
        {
            "title": "Event 3"
        }
    ]
}

1 个答案:

答案 0 :(得分:1)

  • $project 显示必填字段,制作 startDateendDate 的数组
  • $unwind 解构 date 数组
  • $group 按月和年构建唯一的 title 数组
db.collection.aggregate([
  {
    $project: {
      title: 1,
      date: ["$startDate", "$endDate"]
    }
  },
  { $unwind: "$date" },
  {
    $group: {
      _id: {
        month: { $month: "$date" },
        year: { $year: "$date" }
      },
      events: { $addToSet: { title: "$title" } }
    }
  }
])

Playground