Агрегация в MongoDB с использованием операторов $group и $match допускает различный порядок их применения, влияющий на эффективность.
Порядок выполнения $group и $match
Можно применять $group перед $match. В этом случае $match ссылается на поля, начинающиеся с _id, содержащие результаты группировки. Например, группировка по H и I color, а затем фильтрация по _id.H или _id.I color (например, _id.H > sodium). Результатом будет документ с полем _id, содержащим сгруппированные значения H и I color.
Более эффективно использовать $match перед $group. В первом случае группируется вся коллекция, затем фильтруются результаты. Фильтрация по H перед группировкой даёт аналогичный результат.
Практический пример
Предположим, документы сгруппированы по eye color и age. После $group получаем документы со вложенными документами, содержащими eye color и age. Фильтрация возможна только по _id.I color или _id.age.
Для фильтрации по I color используется точечная нотация и двойные кавычки: "I color". Например, для I color = blue: { "_id.I color": "blue" }. Это отфильтрует документы, где I color равно «blue».
Резюме
Группировка по eye color и age создаёт набор документов со всеми возможными парами. Фильтрация по I color = blue с помощью _id.I color выбирает соответствующие пары. Изменение порядка $match и $group с использованием eye color вместо _id.I color даёт аналогичный результат.
$count
Следующий этап — $count, подсчитывающий количество документов после агрегации.