You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.11 23:35:23