MongoDB中按日期与Task_type多级分组统计时长
MongoDB按日期+任务类型分组统计时长(实现指定输出格式)
聚合管道代码
db.collection.aggregate([ // 拆解Work数组,将每个工作项转为独立文档 { $unwind: "$Work" }, // 按「日期+任务类型」分组,计算该组合的总时长 { $group: { _id: { date: "$Work.date", taskType: "$Work.Tasks.Task_type" }, totalDuration: { $sum: "$Work.Tasks.duration" } } }, // 按日期分组,将不同任务类型的时长映射为固定字段 { $group: { _id: "$_id.date", WorkDuration: { $sum: { $cond: [{ $eq: ["$_id.taskType", "Work"] }, "$totalDuration", 0] } }, MeetingDuration: { $sum: { $cond: [{ $eq: ["$_id.taskType", "Meeting"] }, "$totalDuration", 0] } }, BreakDuration: { $sum: { $cond: [{ $eq: ["$_id.taskType", "Break"] }, "$totalDuration", 0] } } } }, // 按日期升序排序(可选) { $sort: { _id: 1 } } ])
各阶段说明
- $unwind:将嵌套的
Work数组拆分为独立文档,确保每个工作记录能被单独处理,是后续分组的基础。 - 第一次$group:以「日期+任务类型」为组合键,先累加同日期同类型的时长,得到每个类型在对应日期的总时长。
- 第二次$group:以日期为唯一分组键,通过
$cond条件判断,将不同任务类型的总时长映射到指定字段;没有对应类型的日期,该字段自动累加0,完全匹配期望输出格式。 - $sort:可选步骤,按日期升序排列结果,让输出更规整。
输出结果
{ "_id" : "2022-10-06", "WorkDuration" : 0, "MeetingDuration" : 0, "BreakDuration" : 60 } { "_id" : "2022-10-07", "WorkDuration" : 20, "MeetingDuration" : 60, "BreakDuration" : 0 } { "_id" : "2022-10-08", "WorkDuration" : 0, "MeetingDuration" : 50, "BreakDuration" : 0 }
内容的提问来源于stack exchange,提问作者ABRAAR KHN
相关产品推荐
相关产品推荐

