如何从MongoDB的Cart集合中查询销量最高的5个商品
销量Top5商品查询实现方案
你可以直接使用Mongoose的聚合管道实现该需求,核心逻辑是拆分订单商品数组、按商品维度聚合统计销量、排序后取前5条,具体实现如下:
完整查询代码
const topProducts = await Cart.aggregate([ // 1. 拆分orderData数组,将每个商品单独拆分为一条记录 { $unwind: "$orderData" }, // 2. 按商品ID和名称分组,统计累计销量 { $group: { _id: { productId: "$orderData.id", productTitle: "$orderData.title" }, // 累计销量 salesVolume: { $sum: 1 }, // 可选:统计累计销售额 totalSalesAmount: { $sum: { $toDouble: "$orderData.price" } } } }, // 3. 按销量倒序排序 { $sort: { salesVolume: -1 } }, // 4. 取前5名 { $limit: 5 }, // 可选:格式化返回字段,更符合使用习惯 { $project: { _id: 0, productId: "$_id.productId", productTitle: "$_id.productTitle", salesVolume: 1, totalSalesAmount: 1 } } ])
代码说明
$unwind阶段会把每个Cart文档里的orderData数组拆分为多条独立的商品记录,方便后续按商品聚合- 分组时同时按商品ID和商品名称分组,避免后续还要关联查询商品名称,也避免同ID不同名的异常数据问题
- 你的示例中price是字符串类型,所以统计销售额时用
$toDouble做了类型转换,如果后续调整schema把price存为数值类型可以去掉该转换
Schema优化建议
你当前的orderData定义为type:[Object]太过宽泛,建议明确字段结构,避免脏数据写入:
new mongoose.Schema({ orderData:[{ id: String, title: String, price: Number // 建议直接存数值类型 }], totalPrice: Number, createdOn: {type: Date, default: Date.now} })
内容的提问来源于stack exchange,提问作者devSol-shahzaib
相关产品推荐
相关产品推荐

