Проверка поля числа Мангуста с минимальным валидатором - PullRequest
0 голосов
/ 31 октября 2018

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

  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 выдаст ошибку, так как оно пытается сохранить оба поля в отрицательное значение.

К моему удивлению, не было выдано никакой ошибки, и было сохранено отрицательное значение. Что я делаю не так?

1 Ответ

0 голосов
/ 31 октября 2018

Валидатор, который вы здесь определили, является просто промежуточным программным обеспечением , которое проверяет условия, когда вы пытаетесь использовать метод .save() в своей схеме. Есть также несколько специальных валидаторов для обновлений (описанных здесь ), но, к сожалению, они не поддерживают $inc операции, так как они выполняются в базе данных (за пределами mongoose).

Обходным решением для вас может быть изменение условия 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, либо обновленный результат.

...