Как удалить элемент массива со значением null в проекции (project), mongodb

#arrays #mongodb #aggregation-framework #projection

#массивы #mongodb #aggregation-framework #проекция

Вопрос:

Я пытаюсь удалить элемент null из массива в проекте, попробуйте использовать $reduce

Ввод: [«foo», «bar», null]

Вывод: [«foo», «bar»]

 $project: {
    "newArray": { 
        $reduce: {
        input: "$arrayInput",
            initialValue: [],
            in: {
                $concatArrays: [
                    "$$value",
                     {
                         $cond: {
                             if: { $eq: [ "$$this", null ] },
                             then: [],
                             else: ["$$this"]
                         }
                    },
                ]
            }
        }
    }
}
  

Комментарии:

1. Не могли бы вы также показать коллекции примеров и желаемый результат

Ответ №1:

Решение 1:

Мы должны преобразовать $$this в массив ([$$this]) и сравнить с [null]

 $project: {
    "newArray": { 
        $reduce: {
        input: "$arrayInput",
            initialValue: [],
            in: {
                $concatArrays: [
                    "$$value",
                    {
                         $cond: {
                             if: { $eq: [["$$this"], [null]] },
                             then: [],
                             else: ["$$this"]
                         }
                    },
                ]
            }
        }
    }
}
  

Решение 2:

В случае, если вы хотите исключить повторяющиеся значения, мы должны использовать $setIntersection во входном значении.

Ввод: [«foo», «bar», null, «foo», «bar»]

Вывод: [«foo», «bar»]

 $project: {
    "newArray": { 
        $reduce: {
        input: { "$setIntersection": "$arrayInput" },
            initialValue: [],
            in: {
                $concatArrays: [
                    "$$value",
                    {
                         $cond: {
                             if: { $eq: [["$$this"], [null]] },
                             then: [],
                             else: ["$$this"]
                         }
                    },
                ]
            }
        }
    }
}
  

Ответ №2:

Это может быть достигнуто с помощью $filter

 $project: {
    newArray: {
        $filter: {
            input: "$arrayInput",
            as: "a",
            cond: {$ne:["$$a",null]}
            }
        }
    }