Объединение $match и $group: пример
Рассмотрим пример комбинированного использования этапов $match и $group в агрегации MongoDB. Этап $match отфильтрует документы с favoriteFruit: "banana". Затем этап $group создаст документы с полем _id, содержащим вложенный документ с полями age и eyeColor. Все документы из коллекции persons сначала проходят фильтрацию на этапе $match, а затем на этапе $group формируются новые документы, содержащие все возможные комбинации age и eyeColor из отфильтрованных документов. Результирующие документы будут иметь поле _id со значением — вложенный документ с полями age и eyeColor.
Многоэтапная агрегация
Рассмотрим пример с дополнительным этапом. После этапа $match (фильтрация по favoriteFruit: "banana") добавим этап $match (фильтрация по gender: "female"), а затем этап $group (группировка по eyeColor и age). Результатом будут документы с eyeColor: "blue", age: 27 и другие подобные пары. Для обеспечения наличия поля gender во всех результирующих документах, добавим его в качестве поля, со значением, взятым из входных документов. Все результирующие документы будут иметь gender: "female".
Резюме
В многоэтапной агрегации документы из коллекции persons сначала проходят этап $match (фильтрация по gender: "female"). Затем на этапе $group происходит группировка по eyeColor, age и gender. Результат — документы с полем _id, значением которого является вложенный документ с полями eyeColor, age и gender, представляющими все возможные комбинации этих значений из отфильтрованных документов.
Изменение порядка этапов
Влияние изменения порядка этапов $match и $group будет рассмотрено в следующем примере.