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

✅ Решения

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

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

Вторая часть практической отработки продолжает задачи после вычисленного total.

Сначала нужно отсортировать sales по новому полю total и найти самые большие заказы.

Самый активный reviewer в Airbnb ищется через $unwind, $group, $sort и $limit.

Топ-5 популярных кухонь строится группировкой restaurants по cuisine.

$lookup объединяет customers и transactions по accounts/account_id.

Geo-запрос по Brighton Beach использует Polygon из neighborhoods и $geoWithin для restaurants.

Домашка 19 анализирует ich.Spotify_Youtube: Danceability, Energy, Duration_ms, Album, Views и Stream.

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

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

Задача 6

db.sales.find({}, { storeLocation: 1, total: 1, saleDate: 1 })
  .sort({ total: -1 })
  .limit(10)

Сортируем по вычисленному полю total из предыдущей части.

Задача 7

db.listingsAndReviews.aggregate([
  { $unwind: "$reviews" },
  { $group: { _id: "$reviews.reviewer_id", reviewer_name: { $first: "$reviews.reviewer_name" }, total_reviews: { $sum: 1 } } },
  { $sort: { total_reviews: -1 } },
  { $limit: 1 }
])

Каждый отзыв становится отдельным входным документом для группировки.

Задача 8

db.restaurants.aggregate([
  { $group: { _id: "$cuisine", count: { $sum: 1 } } },
  { $sort: { count: -1 } },
  { $limit: 5 },
  { $project: { _id: 0, cuisine: "$_id", count: 1 } }
])

Топ строится после подсчёта count.

Задача 9

db.customers.aggregate([
  { $match: { name: "Lauren Clark" } },
  { $lookup: { from: "transactions", localField: "accounts", foreignField: "account_id", as: "customer_transactions" } },
  { $project: { _id: 1, username: 1, name: 1, email: 1, transactions: "$customer_transactions" } }
])

$lookup добавляет массив customer_transactions.

ДЗ 19: альбом с максимумом треков

db.Spotify_Youtube.aggregate([
  { $group: { _id: "$Album", tracks: { $sum: 1 } } },
  { $sort: { tracks: -1 } },
  { $limit: 1 }
])

Группировка по Album отвечает на вопрос об одном альбоме с максимальным количеством треков.

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