考虑以下示例,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"
}
]
}
答案 0 :(得分:1)
$project
显示必填字段,制作 startDate
和 endDate
的数组$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" } }
}
}
])