MongoDB聚合管道:为嵌套子文档添加父字段名作为新字段
完全可以实现这个需求,你可以通过MongoDB聚合管道里的$objectToArray、$map和$arrayToObject这几个操作符组合来完成,具体实现如下:
聚合管道步骤说明
- 转换tags为键值对数组:用
$objectToArray把tags嵌套对象转成[{k: "tag_xx", v: {...}}]格式的数组,这样就能获取每个子文档对应的父字段名。 - 遍历添加tagName字段:用
$map遍历上述数组,给每个元素的子文档(v字段)新增tagName字段,值取当前元素的k(父字段名称)。 - 恢复tags对象结构:用
$arrayToObject把处理后的数组重新转为嵌套对象,还原tags原本的结构。 - 保留原文档字段:通过
$addFields操作替换原tags字段,同时保留name等其他原有字段。
完整聚合管道代码
db.collection.aggregate([ { $addFields: { tags: { $arrayToObject: { $map: { input: { $objectToArray: "$tags" }, as: "tag", in: { k: "$$tag.k", v: { $mergeObjects: [ "$$tag.v", { tagName: "$$tag.k" } ] } } } } } } } ])
执行结果
运行上述管道后,文档会转换成你期望的结构:
[ { "name": "01", "tags": { "tag_01": { "a": "a01-val", "b": "b01-val", "tagName": "tag_01" }, "tag_02": { "a": "a02-val", "b": "b02-val", "tagName": "tag_02" } } }, { "name": "02", "tags": { "tag_03": { "a": "a03-val", "b": "b03-val", "tagName": "tag_03" }, "tag_04": { "a": "a04-val", "b": "b04-val", "tagName": "tag_04" } } } ]
内容的提问来源于stack exchange,提问作者Sony Antony
相关产品推荐
相关产品推荐

