Этот пример демонстрирует изменение порядка этапов $match и $group. $group выполняется первым, за ним следует $match. Содержимое этапов $group и $match остается неизменным. Группировка выполняется по цвету глаз (eye color) и возрасту (age), а фильтрация — по любимому фрукту (favorite fruit).
Результат перестановки этапов
Результат — отсутствие документов. Причина — неверный порядок этапов.
Анализ проблемы
Рассмотрим пример, где сначала выполняется $match, затем $group. Удалим поле gender, поскольку оно не используется в фильтрации по любимому фрукту. Изменим порядок этапов в запросе агрегации: $group станет первым, $match — вторым.
Результат выполнения — 0 документов.
На первом этапе ($group) все документы из коллекции persons группируются по цвету глаз и возрасту. Результат — документы со структурой: _id — вложенный документ, содержащий eye color и age.
На втором этапе ($match) происходит попытка сопоставить документы по полю gender. Однако, результирующие документы из этапа $group не содержат поля gender, а только поле _id — вложенный объект с полями eye color и age. Поэтому результат пустой.
Изменение подхода к фильтрации
Для получения желаемого результата при изменении порядка этапов необходимо изменить подход к фильтрации. Это показано в следующем примере.