Я разработал несколько вариантов, предполагая, что вы хотите избегать только пустых строк, так что это все о строках.
Вариант 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.
Источник:
- MongoDB использование оператора $ set + примеры
- Пн goose валидаторы (minLength) + опция runValidators