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

基于MongoDB按分类ID统计有效销售额总和的实现咨询

实现方案:MongoDB 按分类ID统计有效销售额总和

针对你的需求,我们可以用MongoDB的**聚合管道(Aggregation Pipeline)**来关联三个集合,过滤有效订单并按分类ID聚合求和,具体实现如下:

完整聚合查询代码

db.sells.aggregate([
  // 第一步:过滤出仅状态为active的销售记录
  {
    $match: { status: "active" }
  },
  // 第二步:关联product集合,获取每个销售记录对应的分类ID
  {
    $lookup: {
      from: "product",
      localField: "productId",
      foreignField: "id",
      as: "productInfo"
    }
  },
  // 第三步:展开productInfo数组(lookup返回的是数组,转成单个文档方便后续处理)
  { $unwind: "$productInfo" },
  // 第四步:关联category集合,确保统计的是有对应分类的有效数据(可选但更严谨)
  {
    $lookup: {
      from: "category",
      localField: "productInfo.catId",
      foreignField: "id",
      as: "categoryInfo"
    }
  },
  // 第五步:展开categoryInfo数组
  { $unwind: "$categoryInfo" },
  // 第六步:按分类ID分组,计算销售额总和
  {
    $group: {
      _id: "$categoryInfo.id", // 以分类ID作为分组键
      totalSales: { $sum: "$value" } // 累加当前分类下的有效销售额
    }
  },
  // 可选:调整输出字段名,让结果更贴合需求
  {
    $project: {
      idCategory: "$_id",
      totalSales: 1,
      _id: 0
    }
  }
])

代码逐段解释

  • $match阶段:先过滤掉状态为Inactive的销售记录,只保留有效数据,减少后续处理的数据集大小。
  • $lookup + $unwind:先关联product集合,通过productId匹配产品的id,再用$unwind把返回的数组转为单个文档,避免后续分组时出现嵌套结构。
  • 第二次$lookup + $unwind:关联category集合,通过产品的catId匹配分类的id,确保我们只统计有合法分类的销售数据(如果你的业务里产品必然对应分类,这一步可以省略,但加上能避免脏数据干扰)。
  • $group阶段:以分类ID为分组依据,用$sum累加每个分类下的有效销售额,这是核心的统计逻辑。
  • $project阶段:可选步骤,把默认的分组键_id重命名为你需要的idCategory,同时隐藏_id字段,让输出结构更直观。

测试数据的运行结果

用你提供的测试数据执行上述查询后,会得到如下结果:

[ { idCategory: 1, totalSales: 80 } ]

第二条销售记录因为状态是Inactive会被过滤,所以只有分类1有有效销售额。

性能优化建议

如果你的数据量较大,可以给以下字段建立索引来提升查询速度:

  • sells.status、sells.productId
  • product.id、product.catId
  • category.id

内容的提问来源于stack exchange,提问作者fernando

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.27 04:10:57