MongoDB聚合查询实现按数组对象sellerId字段分组统计price总和
你可以直接在现有聚合的基础上补充阶段,也可以优化流程避免不必要的数组合并再拆分操作,以下是最优实现方案:
完整代码(保留你之前$addToSet去重item的逻辑)
const test = await salesModel.aggregate([ // 拆分每个文档的items数组为单条item记录 { $unwind: "$items" }, // 对item去重,对应你原逻辑里的$addToSet效果 { $group: { _id: "$items._id", price: { $first: "$items.price" }, sellerId: { $first: "$items.sellerId" } } }, // 按sellerId分组统计price总和 { $group: { _id: "$sellerId", sumPrice: { $sum: "$price" } } }, // 调整输出字段名 { $project: { _id: 0, sellerId: "$_id", sumPrice: 1 } }, // 把结果合并到data数组中,匹配你要的输出格式 { $group: { _id: 0, data: { $push: "$$CURRENT" } } }, // 移除外层不需要的_id字段 { $project: { _id: 0 } } ])
简化版本(不需要item去重时使用)
如果你的业务场景里不会出现重复的item,可以去掉去重阶段,直接分组统计,性能更好:
const test = await salesModel.aggregate([ { $unwind: "$items" }, { $group: { _id: "$items.sellerId", sumPrice: { $sum: "$items.price" } } }, { $project: { _id: 0, sellerId: "$_id", sumPrice: 1 } }, { $group: { _id: 0, data: { $push: "$$CURRENT" } } }, { $project: { _id: 0 } } ])
内容的提问来源于stack exchange,提问作者Temitope Bamidele
相关产品推荐
相关产品推荐

