MongoDB: $ project с $ filter, включает все остальные атрибуты - PullRequest
0 голосов
/ 23 февраля 2019

Я использую агрегированный запрос MongoDB, который содержит этап $project, содержащий оператор $filter:

[
    '$project' => [
        'array' => [
            '$filter' => [
                'input' => '$array',
                'as' => 'array',
                'cond' => [
                    '$in' => [
                        "value",
                        '$$array.subarray'
                    ]
                ]
            ]
        ]
    ]
]

Это отфильтровывает все элементы массива, которые не имеют определенного значения вsubarray.

Хотя это работает так, как задумано, оно также удаляет все остальные поля из совокупного запроса и только передает поле массива на следующий этап.Как я могу указать стадии $project не удалять другие поля, кроме фильтрации этих элементов массива?

Я прочитал, что исключение одного поля вызывает включение всех других полей, но кроме этого у меня нетВ поле, которое я хочу исключить, я не могу добавить операцию исключения к этому этапу $project, так как операция $filter уже действует как операция ввода, и вы не можете смешать их.Есть идеи?

1 Ответ

0 голосов
/ 01 марта 2019

Используйте $addFields этап агрегации вместо $project.$addFields manual гласит:

Этап $ addFields эквивалентен этапу $ project, который явно указывает все существующие поля во входных документах и ​​добавляет новые поля.

Следовательно, достаточно заменить $project на $addFields в коде для архивации желаемого поведения.

Это было предложено @Veeram в комментариях.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...