MongoDB聚合查询中如何计算各分类年成本占总年成本的百分比
实现方案
核心逻辑
你需要在现有聚合管道的基础上,新增两步计算:先统计所有分类的总年度成本,再用单分类年成本除以总年度成本得到价值占比。
推荐使用MongoDB 5.0及以上版本支持的$setWindowFields算子实现,无需拆分管道即可快速得到全局总和。
完整修改后的聚合语句
db.collection.aggregate([ // 原有门店过滤逻辑不变 { $match: { store_name: "jasperstore" } }, // 原有分组逻辑不变,删除重复定义的冗余count字段 { $group: { _id: { category: "$category", }, "total_sku": { "$addToSet": "$sku" }, "annual_cost": { $sum: "$rate_gst" }, "total_mrp": { $sum: "$mrp" }, total_margin_half: { $sum: { $subtract: [ { $sum: "$mrp" }, { $sum: "$rate_gst" } ] } } } }, // 原有字段映射逻辑不变 { $project: { "sku count": { "$size": "$total_sku" }, "annual cost": "$annual_cost", "annual mrp": "$total_mrp", "margin %": { $divide: [ "$total_margin_half", "$total_mrp" ] } } }, // 新增:计算全部分类的总年度成本,写入每个文档的临时字段 { $setWindowFields: { sortBy: {}, output: { total_all_cost: { $sum: "$annual cost", window: { documents: ["unbounded", "unbounded"] } } } } }, // 新增:计算价值占比,乘以100直接返回百分比格式,不需要可删除$multiply逻辑 { $addFields: { "value share %": { $multiply: [ { $divide: ["$annual cost", "$total_all_cost"] }, 100 ] } } }, // 可选:如果不需要展示总年度成本字段,可以追加该阶段删除临时字段 { $project: { total_all_cost: 0 } } ])
低版本MongoDB兼容方案(<5.0版本)
如果你的MongoDB版本不支持$setWindowFields,可以用$facet算子替代实现:
// 原有match、group、project阶段保持不变,在原有project阶段后替换为以下逻辑 { $facet: { category_detail: [], // 存放原有各分类的明细数据 total_cost: [ { $group: { _id: null, total_all_cost: { $sum: "$annual cost" } } } ] } }, { $unwind: "$category_detail" }, { $unwind: "$total_cost" }, { $project: { _id: "$category_detail._id", "sku count": "$category_detail.sku count", "annual cost": "$category_detail.annual cost", "annual mrp": "$category_detail.annual mrp", "margin %": "$category_detail.margin %", "value share %": { $multiply: [ { $divide: ["$category_detail.annual cost", "$total_cost.total_all_cost"] }, 100 ] } } }
内容的提问来源于stack exchange,提问作者CK5
相关产品推荐
相关产品推荐

