如何防止 Moongoose 中的字段更新

Dag*_*nqx 4 mongoose mongodb node.js

我有一个看起来像这样的架构:

"use strict"

const mongoose = require('mongoose');
const timestamp  = require('mongoose-timestamp');

const CustomerSchema = new mongoose.Schema({
    name : {
        type : String,
        required : true,
        trim : true
    },
    email : {
        type : String,
        required : true,
        trim : true
    },
    balance : {
        type : Number ,
        default : 0
    }
})

//use timestamps to add created at and updated at
CustomerSchema.plugin(timestamp);

const Customer = mongoose.model('Customer',CustomerSchema);

module.exports = Customer;
Run Code Online (Sandbox Code Playgroud)

当我想运行更新时,我运行此代码

const Customer = require('../models/Customer');
const customer =  await Customer.findOneAndUpdate({_id : req.params.id}, req.body);
Run Code Online (Sandbox Code Playgroud)

所以req.body携带将要更新的数据 问题是我不希望人们更新电子邮件字段。

所以我的问题是:

如何锁定电子邮件字段不被更新。有没有办法将它锁定在架构中,以便它只能在最初添加而不能在以后更新?

谢谢 。

小智 6

您可以在架构级别定义一个名为 的属性immutable

参考文档:https : //mongoosejs.com/docs/api/schematype.html#schematype_SchemaType-immutable

所以你的架构看起来像这样:

const CustomerSchema = new mongoose.Schema({
    name : {
        type : String,
        required : true,
        trim : true
    },
    email : {
        type : String,
        required : true,
        trim : true,
        immutable: true // ADD THIS PROPERTY HERE
    },
    balance : {
        type : Number ,
        default : 0
    }
}
Run Code Online (Sandbox Code Playgroud)


Ift*_*ani 5

没有阻止更新的功能

您可以通过email从中删除对象来完成body

delete req.body.email;
const customer =  await Customer.findOneAndUpdate({_id : req.params.id}, req.body);
Run Code Online (Sandbox Code Playgroud)