防止使用Mongoose模式修改字段

Dan*_*ero 3 mongoose node.js

定义新的Mongoose模式时,是否可以通过“不可修改的”设置(例如类型,必需等)来设置字段?这意味着一旦创建了新文档,就不能更改该字段。

例如,如下所示:

var userSchema = new mongoose.Schema({
  username: {
    type: String,
    required: true,
    unmodifiable: true
  }
})
Run Code Online (Sandbox Code Playgroud)

elb*_*aid 6

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

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

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


比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
  }
});
Run Code Online (Sandbox Code Playgroud)

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


小智 0

您可以使用Mongoose Immutable。这是一个小软件包,您可以使用下面的命令安装,它允许您使用“不可变”属性。

npm install mongoose-immutable --save
Run Code Online (Sandbox Code Playgroud)

然后使用它:

var userSchema = new mongoose.Schema({
    username: {
        type: String,
        required: true,
        immutable: true
    }
});
userSchema.plugin(immutablePlugin);
Run Code Online (Sandbox Code Playgroud)