← К оглавлению занятия

✅ Решения

📁 Блок: MongoDB / Aggregation Pipeline ⏱️ Время изучения: ~90 мин 🎯 Сложность: Средняя

⚡ Кратко: суть занятия

Занятие 62 вводит агрегацию MongoDB как цепочку стадий.

Aggregation Pipeline передаёт документы от одной стадии к следующей.

$match фильтрует, $group группирует, $sort сортирует, $skip пропускает, $limit ограничивает, $project выбирает поля.

В $group ключ группировки записывается в _id.

$sum: 1 считает документы в группе.

$avg, $max, $min, $round, $first и $last считают значения внутри групп.

Compass позволяет собирать стадии визуально и копировать массив pipeline из квадратных скобок.

Топ-3 ошибки: фильтровать после группировки не тем полем, забыть знак $ перед полем, группировать массив countries без понимания структуры результата.

Пошаговые решения

Решение 1

[{ $group: { _id: "$vendor", total: { $sum: 1 } } }]

$sum: 1 считает количество документов по каждому vendor.

Решение 2

[{ $group: { _id: "$vendor", total: { $sum: 1 }, avg_mileage: { $avg: "$distance" } } }]

$avg применяется к distance внутри каждой группы.

Решение 3

[{ $group: { _id: "$vendor", total: { $sum: 1 }, avg_mileage: { $avg: "$distance" } } }, { $match: { avg_mileage: { $gt: 2000 } } }]

Фильтр по avg_mileage ставится после $group, потому что поле создано группировкой.

Решение 4

[{ $group: { _id: "$year", total: { $sum: 1 } } }]

Группировка по year считает фильмы каждого года.

Решение 5

[{ $match: { year: { $in: ["1980", "1981", "1982", "1983", "1984", "1985", "1986", "1987", "1988", "1989", "1990"] } } }, { $group: { _id: "$year", total: { $sum: 1 } } }, { $sort: { _id: 1 } }]

year в источнике рассматривается как текст, поэтому годы перечислены строками.

Решение 6

[{ $group: { _id: "$countries", total: { $sum: 1 } } }, { $sort: { total: -1 } }, { $limit: 3 }]

После подсчёта стран сортировка по total -1 ставит популярные страны первыми.