Сценарий MongoDB создает пустой объект, когда находит нулевой объект, а не игнорирует его, как я могу это исправить?

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


76
1

Ответ:

Решено

Таким образом, решение здесь состоит в том, чтобы использовать функцию $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".