MongoDB агрегация: $group и $match — эффективный порядок

Агрегация в 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, подсчитывающий количество документов после агрегации.

Что будем искать? Например,программа