使用最小验证器验证猫鼬编号字段

时间:2018-10-31 13:16:51

标签: mongodb mongoose mongoose-schema

我有一个这样声明的字段

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

令我惊讶的是,未引发任何错误,并且保存了负值。 我在做什么错了?

1 个答案:

答案 0 :(得分:1)

您在此处定义的

Validator只是一个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);

在这种情况下,如果功劳少于null,您将得到60或更新结果。