пн goose: не обновлять, если значение равно "", но обновлять иначе - PullRequest
0 голосов
/ 03 февраля 2020

При обновлении одной записи, если значение равно "", существующее значение перезаписывается, и я не хочу, чтобы оно было ...

      const company = "myCo"
      const name = "someName"
      const description = '';
      const image = ''
      const updated = await assetClasses
        .updateOne(
          { company, name },
          {
            $set: {
              description,
              image,
            },
          }, 
          {
            upsert: true,
          }
        )
        .exec();

Данные выглядят как

_id:5e38002a56fa5e54f1fe10de
indistructable:false
company:"myCo"
description:"dont overwrite me"
image:"myimage.png"
name:"someName"
supply:10000
createdAt:2020-02-03T11:12:42.371+00:00
updatedAt:2020-02-03T13:21:35.924+00:00
__v:0

1 Ответ

1 голос
/ 03 февраля 2020

Я разработал несколько вариантов, предполагая, что вы хотите избегать только пустых строк, так что это все о строках.

Вариант 1 (принятие непустой строки; если пусто - получить существующее значение из дБ):

const setIfNotEmptyString = (value, defaultValue) => ({
  $switch: {
    branches: [{
      case: {
        $not: {
          $eq: [value, '']
        }
      },
      then: value
    }],
    default: defaultValue
  }
});

await assetClasses.updateOne({
  company, name
}, [{
  $set: {
    description: setIfNotEmptyString(description, "$description"),
    image: setIfNotEmptyString(image, "$image")
  }
}], { upsert: true }).exec();

Вариант 2 (аналогично 1, более простой):

const setIfNotEmptyString = (value, defaultValue) => ({ $cond: [{ $not: {$eq: [value, '']} }, value, defaultValue] });

await assetClasses.updateOne({
  company, name
}, [{
  $set: {
    description: setIfNotEmptyString(description, "$description"),
    image: setIfNotEmptyString(image, "$image")
  }
}], { upsert: true }).exec();

Вариант 3 (редактирование модели, не разрешать хранить пустые строки): Например, если ваша модель mon goose выглядит следующим образом:

{
    ...
    description: String,
    image: String
}

Тогда вы можете просто добавить дополнительные правила:

{   ...
    description: {
        type: String,
        minlength: 1
    },
    image: {
        type: String,
        minlength: 1
    }
}

И в ваших запросах на обновление вам нужно передать параметр runValidators

{runValidators: true}

Вы также можете комбинировать варианты 1/2 с 3.

Источник:

  1. MongoDB использование оператора $ set + примеры
  2. Пн goose валидаторы (minLength) + опция runValidators
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...