Проверка поля номера мангуста с помощью минимального валидатора

У меня одно поле объявлено так

  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
110
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Валидатор, который вы здесь определили, - это просто промежуточное ПО, который будет проверять условия, когда вы пытаетесь использовать метод .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, либо обновленный результат.

Другие вопросы по теме