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

如何在MongoDB中更新Schema设置为immutable的字段?

如何更新MongoDB Schema中标记为immutable的字段

问题背景

我的Device集合Schema定义如下:

const Device: Schema = new Schema(
{
  location: {
      type: String,
      required: true,
    },
  macAddress: {
      type: String,
      required: true,
      immutable: true,
    },
  ip: {
      type: String,
      required: true,
      immutable: true,
    },
  },
  {
    timestamps: true,
    versionKey: false,
    collection: 'Device',
  }
);

尝试用以下代码更新macAddress和ip这两个immutable字段,但未生效:

Device.findOneAndUpdate(
    { _id: req.params.mdeviceId },
    { $set: { macAddress: req.body.macAddress, ip: req.body.ip},
    { new: true, upsert: true }
);

请问该如何更新这些特定字段?


解决方法

MongoDB的immutable: true选项会阻止Mongoose自动修改对应字段,要更新这类字段,有两种常用方式:

1. 在更新操作中添加override: true选项

Mongoose允许在更新时通过override参数跳过immutable校验,修改后的代码如下:

Device.findOneAndUpdate(
    { _id: req.params.mdeviceId },
    { $set: { macAddress: req.body.macAddress, ip: req.body.ip } },
    { new: true, upsert: true, override: true } // 添加override选项
);

2. 直接使用MongoDB原生驱动操作

如果上述方法不生效,可以绕过Mongoose的Schema校验,直接调用MongoDB原生驱动的更新方法:

// 获取原生集合对象
const deviceCollection = Device.collection;

deviceCollection.findOneAndUpdate(
    { _id: req.params.mdeviceId },
    { $set: { macAddress: req.body.macAddress, ip: req.body.ip } },
    { returnDocument: 'after' } // 对应Mongoose的new: true
);

注意事项

  • override: true是Mongoose特有的选项,仅对Mongoose提供的更新方法有效
  • 直接使用原生驱动会完全跳过Mongoose的所有校验和中间件,使用时需自行确保传入数据符合业务规则,避免产生脏数据

内容的提问来源于stack exchange,提问作者hdevtr

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.15 16:31:02