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

如何编写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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.05 23:36:00