MongoDB聚合查询:Distinct分组求和功能失效求助
解决MongoDB聚合中分组求和失效的问题
我发现你的聚合查询里的问题啦——你把求和操作放到了分组键(_id)里面,这就导致MongoDB把求和结果当成了分组的依据,而不是对每个分组的Hours字段进行累加。
问题原因分析
在$group阶段,_id里的所有字段都是用来确定分组唯一标识的。你把Hours:{$sum:"$Hours"}写在_id里,意味着MongoDB会把每个文档的Hours值(单个值的求和)当作分组的一部分,这样每个分组只会包含一条记录,自然无法实现多条记录的求和。
修正后的聚合查询
把求和字段从_id中移出来,作为分组结果的独立字段:
db.pms_teamleadtimesheets.aggregate([ // 匹配条件 { "$match": { UserName: "Admin", FacilityID:"59a53f0c6077b2a029c52b7f", ProjectID:"5a042ba02af18ac8388bd3c0" } }, // 分组并求和:_id是分组键,totalHours是组内Hours的总和 { "$group": { _id: { ProjectID: "$ProjectID", Task: "$Text", Phase: "$phase", Comments: "$Comments", TaskType: "$TaskType", Items: "$Items", UserName: "$UserName", IsBillable: "$IsBillable", Date: "$StartDate" }, totalHours: { $sum: "$Hours" } // 求和字段放在_id外面 } }, // 投影输出,转换为小时 { "$project": { _id: 0, ProjectID: "$_id.ProjectID", Phase: "$_id.Phase", Task: "$_id.Task", Comments: "$_id.Comments", TaskType: "$_id.TaskType", Items: "$_id.Items", UserName: "$_id.UserName", IsBillable: "$_id.IsBillable", Date: "$_id.Date", Hours: { $divide: [ "$totalHours", 60 ] } // 使用求和后的totalHours计算 } } ]);
验证结果
用你提供的测试数据:
- 两条
StartDate: "29-05-2018"、Hours:120的记录会被分到同一组,totalHours会求和得到240,除以60后得到4,正好符合你的预期。 - 另外两条
StartDate: "28-05-2018"、Hours:240的记录,求和后得到480,除以60后得到8,也是正确的结果。
内容的提问来源于stack exchange,提问作者Vinoth
相关产品推荐
相关产品推荐

