You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.13 09:25:27