首页 > 解决方案 > 使用 Mongoose Schema 防止字段修改

问题描述

当你定义一个新的 Mongoose Schema 时,有没有办法设置一个“不可修改”设置的字段(例如类型、必需等)?这意味着一旦创建了新文档,就无法更改此字段。

例如,像这样:

var userSchema = new mongoose.Schema({
  username: {
    type: String,
    required: true,
    unmodifiable: true
  }
})

标签: node.jsmongoose

解决方案


从 Mongoose 的 5.6.0 版本开始,我们可以immutable: true在模式中使用(正如前面提到的关于mongoose-immutable包的答案)。典型的用例是时间戳,但在你的情况下,username它是这样的:

const userSchema = new mongoose.Schema({
  username: {
    type: String,
    required: true,
    immutable: true
  }
});

如果您尝试更新该字段,Mongoose 将忽略修改。


比 OP 要求的更进一步,现在有了 Mongoose 5.7.0,我们可以有条件地设置immutable属性。

const userSchema = new mongoose.Schema({
  username: {
    type: String,
    required: true,
    immutable: doc => doc.role !== 'ADMIN'
  },
  role: {
    type: String,
    default: 'USER',
    enum: ['USER', 'MODERATOR', 'ADMIN'],
    immutable: true
  }
});

资料来源:Mongoose 5.6.0 中的新功能:不可变属性Mongoose 5.7 中的新功能:条件不变性,更快的文档数组


推荐阅读