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

💻 Примеры

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

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

Практикум 19 работает с собственной копией коллекции UK_used_cars.

Сначала нужно экспортировать ich.UK_used_cars или импортировать JSON из GitHub в ich_edit с личным суффиксом.

Базовые задачи проверяют производителей: список марок, максимум документов и распределение по transmission.

Для среднего пробега по производителям используется $group с $avg и счётчиком документов.

mpg переводится в l/100km формулой 282.481 / mpg и сохраняется как новое поле.

$merge нужен, чтобы записать вычисленное поле обратно в существующую коллекцию.

$bucket распределяет дизельные авто по диапазонам цены до 20000, 20000-30000, 30000-40000, 40000-60000 и выше 60000.

Топ-3 ошибки: работать в общей коллекции без копии, делить mpg на 282.481 вместо обратной формулы, забыть readable labels для bucket-категорий.

Выполнимые примеры

Список производителей

distinct возвращает массив уникальных значений без подсчёта.

db.UK_used_cars_NAME.distinct("manufacturer");

Марка с максимумом документов

Группировка считает документы по производителю, сортировка оставляет лидера.

db.UK_used_cars_NAME.aggregate([
  { $group: { _id: "$manufacturer", cars: { $sum: 1 } } },
  { $sort: { cars: -1 } },
  { $limit: 1 }
]);

Распределение по transmission

Так видно, каких машин больше: automatic, semi-auto или manual.

db.UK_used_cars_NAME.aggregate([
  { $group: { _id: "$transmission", cars: { $sum: 1 } } },
  { $sort: { cars: -1 } }
]);

Топ-3 по среднему пробегу

count добавлен, чтобы оценить устойчивость среднего значения.

db.UK_used_cars_NAME.aggregate([
  { $group: { _id: "$manufacturer", avgMileage: { $avg: "$mileage" }, cars: { $sum: 1 } } },
  { $sort: { avgMileage: -1 } },
  { $limit: 3 }
]);

l/100km и $merge

Pipeline рассчитывает новое поле и сливает результат в ту же коллекцию.

db.UK_used_cars_NAME.aggregate([
  { $set: { litersPer100km: { $divide: [282.481, "$mpg"] } } },
  { $merge: { into: "UK_used_cars_NAME", whenMatched: "merge", whenNotMatched: "discard" } }
]);

Ценовые категории diesel

После $bucket удобно заменить _id на понятный label через $switch.

db.UK_used_cars_NAME.aggregate([
  { $match: { fuelType: "Diesel" } },
  { $bucket: {
      groupBy: "$price",
      boundaries: [0, 20000, 30000, 40000, 60000],
      default: "60000+",
      output: { cars: { $sum: 1 } }
  } },
  { $set: { category: { $switch: { branches: [
      { case: { $eq: ["$_id", 0] }, then: "до 20000" },
      { case: { $eq: ["$_id", 20000] }, then: "20000-30000" },
      { case: { $eq: ["$_id", 30000] }, then: "30000-40000" },
      { case: { $eq: ["$_id", 40000] }, then: "40000-60000" }
    ], default: "свыше 60000" } } } },
  { $sort: { cars: -1 } }
]);