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

Mongoose Schema的max校验如何引用同Schema内其他字段值

Mongoose 同Schema字段动态校验实现

你要实现currentlyAdded最大值不超过同文档limit字段的需求,不需要找内置max的引用写法,直接用Mongoose自带的自定义校验器就能实现,比硬改内置规则更稳定。

实现代码

const mySchema = new Schema({
  limit: Number,
  currentlyAdded: {
    type: Number,
    validate: {
      // 注意这里不能用箭头函数,否则this指向会丢失
      validator: function (val) {
        return val <= this.limit;
      },
      message: 'currentlyAdded 数值不能超过 limit 设定的上限'
    }
  }
});

关键说明

  • 自定义校验函数内的this默认指向当前被校验的文档实例,可以直接访问同Schema下的所有字段值,完全满足动态取值的需求。
  • 如果你是用updateOne、findOneAndUpdate这类原子更新方法,必须在更新选项里加上runValidators: true,否则校验不会触发:
await MyModel.updateOne(
  { _id: targetId },
  { $set: { currentlyAdded: 5 } },
  { runValidators: true } // 必须加这个参数才会跑校验
);
  • 原子更新场景下校验函数的this不指向文档实例,需要拿更新内容可以通过this.getUpdate()方法获取,要结合查询条件的话可以搭配pre更新钩子做前置处理。

不推荐的写法

不要尝试在pre校验钩子里动态修改内置max的配置值,这种写法会修改Schema全局配置,并发请求时容易出现值串扰的问题,稳定性远低于直接写自定义校验器。

内容的提问来源于stack exchange,提问作者PYTHON DEVELOPER999

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.03 02:01:24