如何通过Mongoose Schema设置字段不可修改?
实现Mongoose字段创建后不可修改的方法
嘿,你提到的unmodifiable属性在Mongoose里并没有直接内置,但我们有几种简单靠谱的方式能实现「创建文档后字段无法修改」的需求,下面给你逐一说明:
1. 使用官方内置的immutable属性(推荐)
从Mongoose 5.6版本开始,官方新增了immutable字段选项,正好对应你想要的“不可修改”功能。设置为true后,该字段在文档创建完成后就无法被修改,除非你特意使用overwrite: true参数或者直接操作底层MongoDB文档来强制修改。
示例代码:
const userSchema = new mongoose.Schema({ username: { type: String, required: true, immutable: true // 开启不可修改特性 } });
如果有人尝试修改这个字段,Mongoose会自动忽略修改操作,或者在严格模式下抛出错误,非常省心。
2. 用pre('save')中间件手动拦截修改
如果你用的是较低版本的Mongoose,或者需要更自定义的逻辑,可以通过前置保存中间件来拦截更新操作,把字段重置为原始值:
const userSchema = new mongoose.Schema({ username: { type: String, required: true } }); userSchema.pre('save', function(next) { // 仅在更新操作时生效(isNew为false表示不是新建文档) if (!this.isNew) { // 获取文档原始的username值,重置当前字段 this.username = this.$original.username; } next(); });
注意这里要用普通函数而不是箭头函数,这样才能让this指向当前的文档实例。
3. 通过字段验证器阻止修改
你也可以给字段添加自定义验证器,当检测到更新时修改了该字段,就抛出验证错误:
const userSchema = new mongoose.Schema({ username: { type: String, required: true } }); userSchema.path('username').validate(function(value) { // 如果是更新操作,且新值和原始值不一致,验证失败 if (!this.isNew && value !== this.$original.username) { return false; } return true; }, '用户名不允许修改');
这种方式会在修改时直接抛出验证错误,更适合需要明确提示的场景。
内容的提问来源于stack exchange,提问作者Dan Monero
相关产品推荐
相关产品推荐

