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

MongoDB聚合管道按material分组求和raisedGrnQuantity异常问题

解决MongoDB聚合管道中按数组内字段分组求和的问题

问题背景

需要在MongoDB聚合管道中,对poDetails数组内的material字段执行分组操作,同时对raisedGrnQuantity字段进行求和聚合。现有管道执行后输出两个独立数组,添加$group阶段后求和结果为0,无法得到期望的分组求和结果。

现有聚合管道

var projectQry = [
    {
        "$unwind": {
            path : '$poDetails',
            preserveNullAndEmptyArrays: true
        }
    },
    {
        $match: {
            "trackNo": campaignId,
            "vendorNo": vendorNo,
            "poDetails.material": output[i].materialCode,
            "status": "Pending"
        }
    },
    {
        $project: {
            "poDetails.raisedGrnQuantity": 1,
            "poDetails.material": 1
        }
    }
];

当前输出结果

[
  {
    _id: 62de2e7f1ad8470012b9dc75,
    poDetails: { material: '300000114', raisedGrnQuantity: '20' }
  },
  {
    _id: 62de30ea1ad8470012b9dc78,
    poDetails: { material: '300000114', raisedGrnQuantity: '15' }
  }
]
[
  {
    _id: 62de2e7f1ad8470012b9dc75,
    poDetails: { material: '910000029', raisedGrnQuantity: '10' }
  },
  {
    _id: 62de30ea1ad8470012b9dc78,
    poDetails: { material: '910000029', raisedGrnQuantity: '5' }
  }
]

期望输出结果

[
  {
    material: '300000114',
    raisedGrnQuantity: '35'
  },
  {
    material: '910000029',
    raisedGrnQuantity: '15'
  }
]

尝试的$group阶段(未得到正确结果)

$group: {
    _id: "$poDetails.material",
    raisedGrnQuantity: { $sum: "$poDetails.raisedGrnQuantity" }
}

问题原因及解决方案

问题原因

  1. 数据类型不匹配:raisedGrnQuantity字段存储为字符串类型,$sum运算符对字符串默认按0计算,导致求和结果异常。
  2. 循环执行管道:当前管道在循环中针对单个materialCode过滤执行,因此输出两个独立数组,无法实现全局分组求和。

修正后的聚合管道

var projectQry = [
    {
        "$unwind": {
            path : '$poDetails',
            preserveNullAndEmptyArrays: true
        }
    },
    {
        $match: {
            "trackNo": campaignId,
            "vendorNo": vendorNo,
            "status": "Pending"
            // 移除单个materialCode的过滤,改为全局处理后分组
        }
    },
    {
        $addFields: {
            // 将字符串类型的数值转为整数,确保求和正常
            "poDetails.raisedGrnQuantity": { $toInt: "$poDetails.raisedGrnQuantity" }
        }
    },
    {
        $group: {
            _id: "$poDetails.material",
            totalRaisedGrnQuantity: { $sum: "$poDetails.raisedGrnQuantity" }
        }
    },
    {
        // 重塑输出结构,匹配期望格式
        $project: {
            _id: 0,
            material: "$_id",
            raisedGrnQuantity: { $toString: "$totalRaisedGrnQuantity" }
        }
    }
];

说明

  • 移除$match中针对单个物料的过滤,让管道一次性处理所有符合条件的数据,避免循环产生多个独立数组。
  • 通过$addFields和$toInt转换字段类型,解决字符串无法求和的问题。
  • 最后用$project阶段调整输出结构,将求和结果转回字符串类型(若需保持原数据类型)。

内容的提问来源于stack exchange,提问作者Atul Kumar

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.24 21:18:16