使用updateOne时Mongoose的Required与Enum验证失效问题
Mongoose updateOne + upsert 时Schema验证失效的解决办法
Mongoose 默认情况下,updateOne()(包括带upsert: true的场景)不会触发 Schema 中配置的required、enum这类验证规则——不管是更新已有文档还是插入新文档都一样,这就是你遇到问题的原因。
要解决这个问题,只需要在更新选项里开启验证开关即可:
方法一:开启 runValidators 选项
在updateOne的第三个参数里添加runValidators: true,这样不管是更新还是upsert插入新文档,都会严格执行Schema的验证规则。
修改你的执行代码如下:
await MonthlyTarget.updateOne( { website: req.body.website, year: req.body.year, month: req.body.month }, req.body, { upsert: true, runValidators: true // 关键:开启Schema验证 } );
这样设置后,当upsert需要创建新文档时,category为空、month不在枚举列表里这类不符合Schema规则的情况都会直接抛出验证错误,和你用create()方法创建文档时的校验逻辑完全一致。
额外说明
runValidators是Mongoose 4.0及以上版本支持的选项,你的代码用了ES模块语法,版本应该满足要求。- 如果是更新现有文档,
runValidators只会校验你要更新的字段;如果需要强制校验文档的所有字段(包括未修改的),可以额外添加context: 'query'选项,但一般业务场景下不需要这么做。
内容的提问来源于stack exchange,提问作者Vishal Sajwan
相关产品推荐
相关产品推荐

