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" } }
问题原因及解决方案
问题原因
- 数据类型不匹配:
raisedGrnQuantity字段存储为字符串类型,$sum运算符对字符串默认按0计算,导致求和结果异常。 - 循环执行管道:当前管道在循环中针对单个
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
相关产品推荐
相关产品推荐

