【问题标题】:Group a date range by month in aggregation mongodb在聚合mongodb中按月分组日期范围
【发布时间】:2021-07-16 21:26:57
【问题描述】:

考虑以下示例,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"
        }
    ]
}

【问题讨论】:

    标签: mongodb mongodb-query


    【解决方案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

    【讨论】:

    • 感谢您的快速回复,这就是我正在寻找的答案:)
    猜你喜欢
    • 2015-01-03
    • 2013-11-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-03-02
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多