MongoDB聚合管道如何展平siteitems字段的嵌套数组?
MongoDB聚合分组后展平嵌套数组的解决方案
需求:按group字段分组,将site与items的键拼接后生成一维数组,当前聚合管道返回的siteitems为嵌套数组,需修改实现展平。
文档集合
[ { "_id": { "$oid": "64ddcb04756827cb9d4633ba" }, "site": "site1", "group": "env1", "items": { "x": { "release": "true" }, "y": { "release": "true" }, "z": { "release": "true" } } }, { "_id": { "$oid": "64ddcb04756827cb9d4633cd" }, "site": "site2", "group": "env1", "items": { "x": { "release": "true" }, "y": { "release": "true" }, "z": { "release": "true" } } } ]
当前输出(嵌套数组)
{ "_id": "env1", "siteitems": [["site1x", "site1y", "site1z"], ["site2x", "site2y", "site2z"]] }
当前使用的聚合管道
[ { $group: { _id: "$group", siteitems: { $push: { $map: { input: { $objectToArray: "$items" }, as: "item", in: { $concat: ["$site", "$$item.k"] } } } } } } ]
修改方案(两种实现方式)
方式一:通过$reduce展平嵌套数组
保留原分组逻辑,后续添加$project阶段,利用$reduce遍历嵌套数组并通过$concatArrays合并为一维数组:
[ { $group: { _id: "$group", siteitems: { $push: { $map: { input: { $objectToArray: "$items" }, as: "item", in: { $concat: ["$site", "$$item.k"] } } } } } }, { $project: { siteitems: { $reduce: { input: "$siteitems", initialValue: [], in: { $concatArrays: ["$$value", "$$this"] } } } } } ]
方式二:先拆分再分组(更直观)
先将items对象转为数组并拆分为单条文档,再按group分组拼接字符串:
[ { $addFields: { itemsKeys: { $objectToArray: "$items" } } }, { $unwind: "$itemsKeys" }, { $group: { _id: "$group", siteitems: { $push: { $concat: ["$site", "$itemsKeys.k"] } } } } ]
修改后输出(一维数组)
{ "_id": "env1", "siteitems": ["site1x", "site1y", "site1z", "site2x", "site2y", "site2z"] }
内容的提问来源于stack exchange,提问作者Naveen R
相关产品推荐
相关产品推荐

