如何编写MongoDB查询从orders集合获取按销量统计的畅销商品
MongoDB 畅销商品统计查询实现
前置说明
你有一个名为orders的MongoDB集合,存储订单数据,每个订单内嵌products数组存放该订单包含的商品列表,需要统计每个商品的总销量和总营收,得到畅销商品列表。
注意事项
- 原集合中
quantity和price字段为字符串类型,统计前需要先转换为数值类型 - 统计维度为商品维度,相同
productID的商品合并计算
具体查询语句
db.orders.aggregate([ // 拆分订单中的商品数组,把每个商品转为独立文档 { $unwind: "$products" }, // 按商品ID分组统计 { $group: { _id: "$products._id", // 分组主键为商品自身的_id productName: { $first: "$products.productName" }, // 取商品名称 productID: { $first: "$products.productID" }, // 取商品编码 // 统计总销量:累加每个商品条目的购买数量,先转整数 totalSales: { $sum: { $toInt: "$products.quantity" } }, // 统计总营收:累加每个商品条目的 单价*购买数量,都先转整数 totalEarning: { $sum: { $multiply: [ { $toInt: "$products.price" }, { $toInt: "$products.quantity" } ] } } } }, // 可选:按总销量倒序排序,得到畅销排行 { $sort: { totalSales: -1 } }, // 可选:调整输出字段顺序和格式,和要求的返回结构对齐 { $project: { _id: 1, productName: 1, productID: 1, totalSales: 1, totalEarning: 1 } } ])
逻辑说明
$unwind阶段:将每个订单文档内嵌的products数组拆分,数组内的每一个商品对象都会生成一个独立的文档,方便后续按商品维度统计$group阶段:以商品自身的_id作为分组主键,合并所有订单中同一个商品的销售数据,用$first保留商品的基础名称和编码,用$sum累加计算总销量和总营收$sort阶段(可选):按照总销量从高到低排序,直接得到畅销商品排行$project阶段(可选):规整输出字段,和你要求的返回格式完全匹配
提示:如果业务中
price存在小数情况,将$toInt: "$products.price"替换为$toDouble: "$products.price"即可。
内容的提问来源于stack exchange,提问作者mesbahul momin
相关产品推荐
相关产品推荐

