如何在MongoDB聚合管道中仅重命名字段而保留其他字段?
MongoDB聚合重命名字段并保留所有其他字段
在MongoDB聚合中使用$project直接指定新字段时,默认只会保留你声明的字段,其他未提及的字段会被过滤。要实现重命名字段同时保留所有原有字段,推荐以下两种实用方法:
方法一:$addFields + $unset(简单直观)
先用$addFields添加映射后的新字段,再用$unset移除旧字段,逻辑清晰易理解:
db.collection.aggregate([ // 新增字段,映射原field2的值 { $addFields: { myNewField: "$field2" } }, // 删除旧的field2字段 { $unset: "field2" } ])
方法二:$project结合$$ROOT(单阶段处理)
如果需要在单个$project阶段完成操作,可以借助$$ROOT获取完整文档,通过合并对象的方式保留其他字段并替换目标字段:
db.collection.aggregate([ { $project: { // 声明新字段 myNewField: "$field2", // 排除旧字段 field2: 0, // 展开原文档的所有其他字段 ..."$$ROOT" } } ])
也可以用$mergeObjects和$unsetField的组合写法:
db.collection.aggregate([ { $project: { merged: { $mergeObjects: [ { myNewField: "$field2" }, // 从原文档中移除旧字段 { $unsetField: { input: "$$ROOT", field: "field2" } } ] } } }, // 将合并后的对象作为根文档输出 { $replaceRoot: { newRoot: "$merged" } } ])
最终输出结果
两种方法都会生成你期望的结构:
[ ... { field1: "value1", myNewField: "value2", field3: "value2", field4: "value4", } ... ]
内容的提问来源于stack exchange,提问作者Winfle
相关产品推荐
相关产品推荐

