You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.29 08:02:19