You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何从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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.07 02:48:03