MongoDB如何按group字段分组去重后聚合拼接name字段值
MongoDB聚合实现按分组拆分去重拼接字段
完整聚合查询语句
db.yourCollectionName.aggregate([ // 拆分name字段为数组,分隔符为分号加空格 { $project: { group: 1, nameItem: { $split: ["$name", "; "] } } }, // 展开数组,将每个值拆分为独立文档 { $unwind: "$nameItem" }, // 按group分组,用$addToSet自动去重收集所有name值 { $group: { _id: "$group", uniqueNameList: { $addToSet: "$nameItem" } } }, // 调整字段格式,拼接为目标字符串 { $project: { _id: { $newObjectId: {} }, // MongoDB 5.0及以上版本支持自动生成新的ObjectId,低版本可删除该行直接使用group值作为_id group: "$_id", name: { $join: ["; ", "$uniqueNameList"] } } } ])
步骤说明
- 第一步$project:将原本用
;分隔的name字符串拆分为数组,方便后续处理单个取值 - 第二步$unwind:将每个数组成员拆分为独立的单值文档,为分组去重做准备
- 第三步$group:按
group字段分组,$addToSet会自动对同组内的重复值做过滤,得到去重后的名称数组 - 第四步$project:将去重后的数组用
;重新拼接为字符串,同时调整字段顺序、生成新的_id字段
低版本兼容方案
如果使用的MongoDB版本低于4.4,不支持$join操作符,可以将最后一步的name字段替换为$reduce实现拼接:
name: { $reduce: { input: "$uniqueNameList", initialValue: "", in: { $cond: [ { $eq: ["$$value", ""] }, "$$this", { $concat: ["$$value", "; ", "$$this"] } ] } } }
内容的提问来源于stack exchange,提问作者Kleyson Rios
相关产品推荐
相关产品推荐

