如何在MongoDB的aggregate group阶段新增sector数组字段?
解决方案
你可以使用MongoDB聚合的$addToSet累加器实现需求,不需要修改原有分组维度,也不会破坏现有统计逻辑,修改后的聚合代码如下:
await Escaneado.aggregate([ { $match: { $and: [ { "gestion": id }, { "disponible": true } ] }, }, { $group: { _id: { code:"$codigo", quantityTarget:"$cantidadObjetivo", }, quantityTotalScanded : { $sum: "$cantidad" }, // 新增:收集当前分组下所有不重复的sector值 tmpSectors: { $addToSet: "$sector" } } }, { $addFields:{ difference:{ $subtract: ["$quantityTotalScanded", "$_id.quantityTarget"]}, // 将收集到的sector数组放到_id对象中 "_id.sector": "$tmpSectors" } }, // 可选:如果不需要保留临时的tmpSectors字段,可以加这一步移除 { $project: { tmpSectors: 0 } } ])
逻辑说明
$addToSet是分组阶段专用的累加器,会自动对同一个分组内的指定字段值去重后存入数组,完全不影响原有按code和quantityTarget分组的逻辑,原有的数量求和统计也不会发生变化。- 之后通过
$addFields直接给_id对象新增sector属性,赋值为收集好的去重数组,即可匹配你需要的输出结构。
如果你的原始文档中sector本身就是数组类型,只需要把$addToSet: "$sector"替换为$addToSet: { $each: "$sector" }即可实现数组元素层级的去重收集。
内容的提问来源于stack exchange,提问作者A V
相关产品推荐
相关产品推荐

