首页 > 解决方案 > 使用 min 验证器验证 mongoose 编号字段

问题描述

我有一个这样声明的字段

  storeCreditD: {
    storeCredit: {
      type: Number,
      default: 0,
      min: [0, 'credit cannot be negative']
    },
    storeDeposit: {
      type: Number,
      default: 0,
      min: [0, 'deposit cannot be negative']
    }
  }

这是我改变模型

  const store = await Store.findOneAndUpdate(
    { _id: storeId },
    { $inc: { 'storeCreditD.storeCredit': credit,
      'storeCreditD.storeDeposit': credit } },
    { new: true }

现在,当我尝试用负信用来做这件事时(示例) const credit = -60,我预计 mongoose 验证器会抛出错误,因为它试图将两个字段都保存为负值。

令我惊讶的是,没有引发错误并保存了负值。我究竟做错了什么?

标签: mongodbmongoosemongoose-schema

解决方案


您在此处定义的验证器只是一个中间件.save(),当您尝试在架构上使用方法时,它将检查条件。还有一些用于更新的特殊验证器(在此处描述),但不幸的是,它们不支持$inc在数据库中执行的操作(在猫鼬之外)。

某种解决方法可能是修改您的find()条件以包括最低要求的信用:

  let credit = -60;
  let minStoreCredit = Math.abs(credit);

  const store = await Store.findOneAndUpdate(
      { storeId: storeId, 'storeCreditD.storeCredit': { $gte: minStoreCredit } },
      { $inc: { 'storeCreditD.storeCredit': credit } },
      { new: true });

console.log(store);

在这种情况下,您将null在信用少于60或更新结果时获得。


推荐阅读