У меня есть большой сценарий, следующий раздел является соответствующей частью, но если люди предпочитают, я могу опубликовать весь сценарий по запросу.
Скрипт перебирает список, ищет поле с именем colour
и переименовывает его в color
.
{
serviceAgreementRefList: {
$map : {
input: "$$this.relatedJson.serviceAgreementRefList",
in: {
$mergeObjects: [
"$$this",
{
$cond: [
{
$ne: [
"$$this.situation",
undefined
]
},
"situation": {
$mergeObjects: [
"$$this.situation",
{
color: "$$this.situation.colour",
}
]
}
},
{},
]
}
]
}
}
}
}
Однако по большей части он работает так, как ожидалось, однако, если объект situation
существует, но является null
, то скрипт создает пустой situation
объект.
Я бы хотел, чтобы любые нулевые объекты situation
оставались нулевыми.
Как я могу этого добиться?
Я думал, что могу добавить функцию $or
к $cond
, но, конечно, это не хуже, а даже усугубляет проблему.
Могу ли я использовать функцию $in
, содержащую две функции $ne
, одну для undefined
и одну для null
?
Я бы предположил, что могу, но я не могу правильно понять синтаксис.
🤔 А знаете ли вы, что...
MongoDB обладает активным сообществом разработчиков и богатой документацией...
Таким образом, решение здесь состоит в том, чтобы использовать функцию $eq
вместо $ne
и сравнить тип поля с тем, что мы ожидаем.
Если тип соответствует ожидаемому, то имя поля будет изменено, если нет, то ничего не изменится.
вот как должна выглядеть функция $cond
:
$cond: [
{
$eq: [
{ $type: "$$this.situation" },
"object"
]
},
{ <code to execute if true> },
{ <code to execute if false> }
]
если situation
заполнено, то $type
вернет "object"
, если это null
, то $type
вернет "null"
, а если оно не существует, $type
вернет "missing"
.