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

✅ Решения

📁 Блок: MongoDB / практикум по агрегации ⏱️ Время изучения: ~90 мин 🎯 Сложность: Практикум

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

Практикум 18 закрепляет агрегацию MongoDB на учебных коллекциях Ich.credit_cards, ich.bookings и ich.sample_training.

Для credit_cards нужно считать средние значения по категориям: образование, доход и семейный статус.

Самый частый уровень образования ищется через группировку, подсчёт, сортировку по убыванию и limit.

В bookings требуется найти среднее количество топлива, использованного за поездку.

В sample_training нужно анализировать города: население, штаты, средние значения и ZIP коды штата IL.

Главная конструкция занятия — aggregate() с этапами $group, $sort, $limit, $match и $project.

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

Разбор решений

Средний возраст по образованию

db.credit_cards.aggregate([
  { $group: { _id: "$Education_Level", avgAge: { $avg: "$Customer_Age" } } },
  { $sort: { _id: 1 } }
])

Ключевой выбор — _id. Именно он задаёт категорию группировки.

Возраст и лимит по семейному статусу

db.credit_cards.aggregate([
  { $group: {
      _id: "$Marital_Status",
      avgAge: { $avg: "$Customer_Age" },
      avgCreditLimit: { $avg: "$Credit_Limit" }
  } },
  { $sort: { _id: 1 } }
])

В одном $group можно считать несколько агрегатов.

Среднее топливо

db.bookings.aggregate([
  { $group: { _id: null, avgFuelUsed: { $avg: "$fuel_used" } } }
])

Если нужна одна общая метрика, _id делают null.

Города по штатам

db.zips.aggregate([
  { $group: { _id: "$state", cityCount: { $sum: 1 }, avgPopulation: { $avg: "$pop" } } },
  { $sort: { cityCount: -1 } }
])

Одна группировка закрывает две задачи: количество городов и среднее население.

Проверить по документации: если имена полей в вашей учебной коллекции отличаются от примеров, адаптируйте запрос после просмотра реального документа.