MongoDB使用aggregate聚合orders集合统计商品销量与销售额
MongoDB 聚合统计数组字段内商品的总销量与总销售额
假设有一个MongoDB订单集合,每个文档对应一条订单记录,包含products对象数组字段,存储订单内所有售出商品的明细。
示例集合数据
// 订单文档1 { id: "62aac8cfb5722d4c628a4a24", products: [ { productId: "62aac8cfb5722d4c628a4a24", quantity: 1, total: 50, }, ], } // 订单文档2 { id: "62aac8cfb5722d4c628a4a24", products: [ { productId: "62aac8cfb5722d4c628a4a24", quantity: 2, total: 100, }, { productId: "65fasd454daer57f2ads4c", quantity: 2, total: 100, }, ], } // 订单文档3 { id: "62aac8cfb5722d4c628a4a24", products: [ { productId: "62aac8cfb5722d4c628a4a24", quantity: 5, total: 200, }, ], }
注:示例中三个文档id字段值完全重复属于提问时的笔误,正常业务中订单主键唯一,该问题不影响聚合逻辑运行
统计需求
跨所有订单文档,按唯一productId统计对应商品的总销量(quantity字段求和)、总销售额(total字段求和),最终返回sales数组,每个数组元素对应一个商品的统计结果,预期结构如下:
{ sales: [ { productId:"62aac8cfb5722d4c628a4a24", quantity:8, total:350 }, { productId:"65fasd454daer57f2ads4c", quantity:2, total:200 } ] }
聚合实现代码
db.你的集合名称.aggregate([ // 拆解products数组,每个商品明细生成一条独立记录 { $unwind: "$products" }, // 按商品ID分组,累加计算总销量、总销售额 { $group: { _id: "$products.productId", quantity: { $sum: "$products.quantity" }, total: { $sum: "$products.total" } } }, // 调整字段结构,匹配输出要求 { $project: { _id: 0, productId: "$_id", quantity: 1, total: 1 } }, // 将所有统计结果归集到sales数组下 { $group: { _id: null, sales: { $push: "$$ROOT" } } }, // 去掉多余的_id字段 { $project: { _id: 0, sales: 1 } } ])
逻辑说明
$unwind阶段负责把嵌套在数组里的商品明细拆成独立文档,解决数组字段无法直接跨文档分组统计的问题- 第一个
$group阶段以商品ID为分组键,用$sum操作符累加所有同ID商品的销量和销售额 - 第一个
$project阶段把分组产生的_id(即商品ID)重命名为要求的productId字段,过滤多余字段 - 后续的
$group和$project阶段负责把所有商品的统计结果整理到sales数组中,匹配最终返回格式
如果不需要把结果包裹在sales字段下、直接返回商品统计数组,可以删掉最后两个聚合阶段。
内容的提问来源于stack exchange,提问作者ali talha
相关产品推荐
相关产品推荐

