如何在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
相关产品推荐
相关产品推荐

