MongoDB聚合:将键值对数组转换为键+唯一值列表结构
MongoDB聚合实现数组压缩为键值唯一列表结构
针对你给出的数据结构转换需求,结合你已经用到的$group和$addToSet,可以通过完整的聚合管道来实现目标结构,具体步骤如下:
完整聚合查询
db.collection.aggregate([ // 展开原始的fruits数组,将每个子对象转为独立文档 { $unwind: "$fruits" }, // 按fruit字段分组,收集对应唯一的type值到types数组 { $group: { _id: "$fruits.fruit", types: { $addToSet: "$fruits.type" } } }, // 重命名字段,将_id转为fruit,去掉原始_id字段 { $project: { _id: 0, fruit: "$_id", types: 1 } }, // 将所有处理后的文档重新组合为fruits数组 { $group: { _id: null, fruits: { $push: "$$ROOT" } } }, // 去掉顶层的_id字段,得到最终结构 { $project: { _id: 0 } } ])
各阶段说明
- $unwind:把原始文档中
fruits数组的每个元素拆分成单独的文档,方便后续分组操作。 - $group(第一次):以
fruit值为分组依据,用$addToSet自动去重收集对应的type值,生成types数组。 - $project:调整文档结构,将分组用的
_id(即fruit值)重命名为fruit字段,同时保留types数组。 - $group(第二次):将所有分组后的单个文档重新聚合到
fruits数组中,恢复顶层的数组结构。 - $project:移除自动生成的
_id字段,完全匹配目标格式。
如果你已经完成了前两个阶段($unwind和第一次$group),只需要执行后续的$project、第二次$group和最后一个$project就能得到目标结构。
内容的提问来源于stack exchange,提问作者ghostMan
相关产品推荐
相关产品推荐

