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

MongoDB按收银员分组统计商品名称出现次数优化需求

优化MongoDB百万级文档的收银员-商品统计查询效率

现有190万条MongoDB文档,结构包含嵌套字段Object.Items.ItemDetail(含ItemName)与Object.Payment.PaymentHeader(含CashierName),需要按CashierName分组,统计每个收银员名下各ItemName的出现次数。当前使用包含$project、$unwind的聚合查询效率不足,需直接通过数据库生成目标输出。

优化后的聚合查询方案

直接简化聚合管道,去除不必要的字段投影,用更紧凑的分组逻辑提升效率:

db.collection.aggregate([
  // 展开商品数组,跳过冗余的$project阶段
  { $unwind: "$Object.Items" },
  // 按收银员+商品名组合分组,先统计基础次数
  {
    $group: {
      _id: {
        cashier: "$Object.Payment.PaymentHeader.CashierName",
        item: "$Object.Items.ItemDetail.ItemName"
      },
      count: { $sum: 1 }
    }
  },
  // 二次分组整理结构,将每个收银员的所有商品统计归为一个数组
  {
    $group: {
      _id: "$_id.cashier",
      itemStats: {
        $push: {
          itemName: "$_id.item",
          count: "$count"
        }
      }
    }
  }
])

效率提升关键点

  • 移除不必要的$project:$project会生成新的文档对象,增加内存占用和数据拷贝开销,直接使用原字段路径操作能大幅减少中间处理成本。
  • 紧凑的分组逻辑:先通过$unwind展开商品数组,再按「收银员+商品名」的组合键做第一次分组统计,最后二次分组整理成清晰的收银员-商品统计结构,全程减少中间数据量。

索引优化建议

创建复合索引加速聚合过程,避免全表扫描:

db.collection.createIndex({
  "Object.Payment.PaymentHeader.CashierName": 1,
  "Object.Items.ItemDetail.ItemName": 1
})

该索引能让MongoDB在执行$group时快速定位并聚合目标字段,显著降低IO开销。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.17 12:05:06