如何在MongoDB中分组数据并合并字段?文档转换需求求助
嘿,我来帮你搞定这个MongoDB聚合的问题!你想要的效果是按name和dept分组,然后把每个分组里的Code字段作为新键,对应的count作为值合并到结果里对吧?我帮你写了一个精准的聚合管道,完全能实现你的需求,咱们一步步来看:
首先,这是完整的聚合查询代码:
db.collection.aggregate([ // 提取name、dept,把Code和count转成键值对格式 { $project: { name: "$_id.name", dept: "$_id.dept", codeCount: { k: "$_id.Code", v: { $toString: "$_id.count" } } } }, // 按name+dept分组,收集所有Code-count键值对 { $group: { _id: { name: "$name", dept: "$dept" }, codePairs: { $push: "$codeCount" } } }, // 将键值对数组转成对象,合并到分组信息中 { $replaceRoot: { newRoot: { $mergeObjects: [ "$_id", { $arrayToObject: "$codePairs" } ] } } }, // 把结果包装到_id字段中,匹配你的输出格式 { $project: { _id: "$$ROOT" } } ])
接下来拆解每个阶段的作用:
- $project阶段:我们从原始文档的
_id对象里拆分出name和dept,同时把Code作为键名(k),count转成字符串作为值(v),生成codeCount这个键值对结构——这一步是为后续的动态键转换做准备。 - $group阶段:核心的分组操作,按
name和dept的组合进行分组,把每个分组内的所有codeCount都收集到codePairs数组里。这一步之后,每个分组会得到类似{ _id: {name: "User1", dept: "A"}, codePairs: [{k: "Code1", v: "4"}, {k: "Code2", v: "4"}] }的中间结果。 - $replaceRoot阶段:用
$arrayToObject把codePairs数组转换成一个对象(比如{Code1: "4", Code2: "4"}),再通过$mergeObjects把这个对象和分组的name、dept合并成一个完整的对象,作为新的根文档。 - 最后一个$project阶段:把合并后的完整对象包装到
_id字段里,完全贴合你想要的输出格式。
小提示:如果你的count不需要转成字符串形式,可以去掉$toString,直接用"$_id.count"作为v的值就行。
内容的提问来源于stack exchange,提问作者KKohl
相关产品推荐
相关产品推荐

