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

如何在MongoDB group聚合查询中为多字段分组添加唯一分组ID

MongoDB多字段分组后生成唯一gid的实现方法

你可以通过在原有分组聚合的基础上追加后续聚合阶段实现需求,根据你使用的MongoDB版本有两种实现方案:

方案1:MongoDB 5.0+ 推荐方案(使用窗口函数)

直接使用$setWindowFields阶段为每个分组生成递增序号,完整聚合语句如下:

db.collection.aggregate([
  // 你已有的按item和price分组的阶段
  {
    $group: {
      _id: { item: "$item", price: "$price" }
    }
  },
  // 窗口函数生成递增序号
  {
    $setWindowFields: {
      sortBy: { "_id.item": 1, "_id.price": 1 }, // 自定义分组排序规则,决定gid的顺序
      output: {
        gid: {
          $documentNumber: {}
        }
      }
    }
  },
  // 可选:如果需要gid为字符串类型,添加该阶段转换
  {
    $addFields: {
      gid: { $toString: "$gid" }
    }
  }
])

说明:你可以调整sortBy里的字段规则来修改gid的生成顺序

方案2:MongoDB 5.0以下版本兼容方案

通过将分组结果合并为数组、拆分数组时绑定数组下标的方式生成gid:

db.collection.aggregate([
  // 你已有的按item和price分组的阶段
  {
    $group: {
      _id: { item: "$item", price: "$price" }
    }
  },
  // 把所有分组结果存入一个临时数组
  {
    $group: {
      _id: null,
      groups: { $push: "$$ROOT" }
    }
  },
  // 拆分数组,同时把数组下标作为gid
  {
    $unwind: {
      path: "$groups",
      includeArrayIndex: "gid"
    }
  },
  // 调整返回字段格式,把gid转成从1开始的字符串
  {
    $replaceRoot: {
      newRoot: {
        $mergeObjects: [
          "$groups",
          { gid: { $toString: { $add: [ "$gid", 1 ] } } }
        ]
      }
    }
  }
])

两种方案执行后都会得到你期望的输出结果。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.05 05:51:02