Список производителей
distinct возвращает массив уникальных значений без подсчёта.
db.UK_used_cars_NAME.distinct("manufacturer");Практикум 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 }
]);Так видно, каких машин больше: automatic, semi-auto или manual.
db.UK_used_cars_NAME.aggregate([
{ $group: { _id: "$transmission", cars: { $sum: 1 } } },
{ $sort: { cars: -1 } }
]);count добавлен, чтобы оценить устойчивость среднего значения.
db.UK_used_cars_NAME.aggregate([
{ $group: { _id: "$manufacturer", avgMileage: { $avg: "$mileage" }, cars: { $sum: 1 } } },
{ $sort: { avgMileage: -1 } },
{ $limit: 3 }
]);Pipeline рассчитывает новое поле и сливает результат в ту же коллекцию.
db.UK_used_cars_NAME.aggregate([
{ $set: { litersPer100km: { $divide: [282.481, "$mpg"] } } },
{ $merge: { into: "UK_used_cars_NAME", whenMatched: "merge", whenNotMatched: "discard" } }
]);После $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 } }
]);