使用Mongo聚合计算cooper_inc在4AM Mart的潜在成本实现求助
4AM Mart的Cooper_inc潜在成本计算Mongo聚合查询实现
需求说明
- 目标:计算4AM Mart门店中cooper_inc制造商的潜在成本
- 潜在成本计算公式:
potential cost = (cooper_inc销往4AM Mart的商品年成本) + (4AM Mart内其他制造商销售同类商品的年成本) - 本次计算涉及品类:cooper_inc供应的面包、奶酪两类商品,无关品类(如功能饮料)、其他门店数据不纳入统计
- 预期结果:
pot_cost = (45+60) + ((56+54) + (34+80)) = $329
现有查询问题
你当前的查询第一步match就仅过滤保留了cooper_inc的商品,因此无法统计其他供应商的同类商品成本,需要调整聚合逻辑。
修改后的完整聚合查询
db.collection.aggregate([ // 第一步:过滤4AM Mart的面包、奶酪类商品,排除无效数据提升查询效率 { "$match": { "shop": "4AM_Mart", "sub_category": { "$in": ["bread", "cheese"] } } }, // 第二步:按子品类分组,用条件聚合分别统计cooper和其他供应商的成本 { "$group": { "_id": "$sub_category", "cooper_cost": { "$sum": { "$cond": [ { "$eq": ["$manufacturer", "cooper_inc"] }, "$cost", 0 ] } }, "other_cost": { "$sum": { "$cond": [ { "$ne": ["$manufacturer", "cooper_inc"] }, "$cost", 0 ] } } } }, // 第三步:全局汇总所有品类的成本,得到最终潜在成本 { "$group": { "_id": null, "total_cooper_cost": { "$sum": "$cooper_cost" }, "total_other_cost": { "$sum": "$other_cost" }, "potential_cost": { "$sum": { "$add": ["$cooper_cost", "$other_cost"] } } } }, // 第四步:格式化输出字段 { "$project": { "_id": 0, "Cooper_inc商品年成本": "$total_cooper_cost", "其他供应商同类商品年成本": "$total_other_cost", "潜在总成本": "$potential_cost" } } ])
返回结果
执行上述查询后得到的结果完全匹配预期值:
{ "Cooper_inc商品年成本": 105, "其他供应商同类商品年成本": 224, "潜在总成本": 329 }
逻辑说明
- 若后续需要适配其他门店、其他制造商的同类计算,仅需要修改
match里的shop、sub_category参数,以及$cond里的manufacturer匹配值即可 - 条件聚合
$cond可以在同一分组内同时统计不同规则的求和结果,避免多次查询关联,性能更优
内容的提问来源于stack exchange,提问作者CK5
相关产品推荐
相关产品推荐

