mongoose 更新数据时不验证数据(忽略设定的集合规则)的问题
阅读原文时间:2023年07月09日阅读:1

问题:

mongoose 更新数据时不验证数据(忽略设定的集合规则)的问题

参考:

http://www.mongoosejs.net/docs/api.html#updateone_updateOne

https://mongoosejs.com/docs/validation.html#update-validators

https://segmentfault.com/q/1010000014305255

https://zhuanlan.zhihu.com/p/40122939

Mongoose也支持对update(),updateOne(),updateMany()和findOneAndUpdate()操作的验证。

默认情况下,更新验证器处于关闭状态-您需要指定runValidators选项。

注意:更新验证器默认情况下处于关闭状态,因为它们有一些注意事项。(至于是什么注意事项,官方文档没写啊)

// 官方示例:
var toySchema = new Schema({
color: String,
name: String
});

var Toy = db.model('Toys', toySchema);

Toy.schema.path('color').validate(function (value) {
return /red|green|blue/i.test(value);
}, 'Invalid color');

var opts = { runValidators: true };
Toy.updateOne({}, { color: 'not a color' }, opts, function (err) {
assert.equal(err.errors.color.message,
'Invalid color');
});

model.update(conditions, doc, option, function (err, res){})
// conditions-查询条件 doc-需要更新的数据
// *** 其中res返回 {n:2, nModified:2, ok: 1} ***
// *** n为匹配到的条数 nModified修改的条数 ok 表为是否成功 ***
const option = { // option选项及其默认值
safe: true, // 安全模式
upsert: false, //如果不存在则创建新纪录
multi: false, // 是否更新多个查询记录
runValidators: null, // 如果值为true,执行Validation验证。
setDefaultsOnInsert: null, // 如果upsert选项为true,在新建时插入文档定义的默认值。
strict: null, // 用严格模式跟新
overwrite: false // 禁用update-only模式,允许覆盖记录。
}

解决方案:

调用Model.updateOne(conditions, doc, [options], [callback]) 方法时,添加 options 属性 runValidators: true

try {
// 修改数据库中的值
// 不验证集合规则
// await Article.updateOne({ _id }, article);
// 验证集合规则
await Article.updateOne({ _id }, article, { runValidators: true });
} catch (error) {
res.send(error);
}

手机扫一扫

移动阅读更方便

阿里云服务器
腾讯云服务器
七牛云服务器