如何在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
相关产品推荐
相关产品推荐

