【问题标题】:Validating mongoose number field with min validator使用 min 验证器验证 mongoose 编号字段
【发布时间】:2018-11-01 00:43:09
【问题描述】:

我有一个这样声明的字段

  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 验证器会抛出错误,因为它试图将两个字段都保存为负值。

令我惊讶的是,没有抛出错误并且保存了负值。 我做错了什么?

【问题讨论】:

    标签: mongodb mongoose mongoose-schema


    【解决方案1】:

    您在此处定义的验证器只是一个 middleware,当您尝试在架构上使用 .save() 方法时,它将检查条件。还有一些用于更新的特殊验证器(描述为here),但不幸的是它们不支持$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);
    

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-09-08
      • 1970-01-01
      • 2012-03-13
      • 2018-12-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多