【发布时间】:2019-08-20 07:25:36
【问题描述】:
我有一个 mongodb 集合“用户”,其中包含“名称”、“电子邮件”、“活动”字段。 我想添加一个验证,即每个文档电子邮件都应该是唯一的。但是,如果文档无效,即 Active 为 false,则可以接受电子邮件。
这是模型
email: { type: String, validate: {
validator: function(v) {
return new Promise((resolve, reject)=> {
console.log("validating email")
const UserModel = mongoose.model('User');
UserModel.find({email : v, active: true}, function (err, docs)
{
if (!docs.length){
resolve();
}else{
console.log('user exists: ',v);
reject(new Error("User exists!"));
}
});
})
},
message: '{VALUE} already exists!'
}
},
name: {
type: String,
required: true
},
active: {
type: Boolean,
default: true
}
问题是每当我对此模型进行任何更新时都会调用此验证。 因此,如果我更新名称,那么也会调用此验证,并给出电子邮件已存在的错误。
如何在电子邮件字段上添加验证,以便如果有人向数据库添加新条目或更新电子邮件,如果现有用户具有相同的电子邮件 ID 并且处于活动状态,它会在数据库中检查?
【问题讨论】:
-
您可以使用 presave 和 preupdate 挂钩。
-
你也可以使用 npm 包 mongoose-unique-validator
-
使用
$set更新文档而不是 mongoose 更新,例如:UserModel.update({_id: 1},{$set: {email: "abc@xyz.com"}})这将跳过 mongoose-schema-validation
标签: node.js validation mongoose mongoose-schema