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

💻 Примеры

📁 Блок: 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 в задаче по длительности.

Рабочие примеры

Самые большие заказы

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

Источник спрашивает, где совершены самые большие заказы; storeLocation помогает ответить.

Самый активный reviewer

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 }
])

Группировка по reviewer_id надёжнее, чем только по имени.

Топ-5 кухонь

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

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

$lookup для Lauren Clark

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" } }
])

accounts у customer — массив, поэтому $lookup найдёт транзакции по всем account_id.

ДЗ 19: топ Spotify

db.Spotify_Youtube.aggregate([
  { $match: { Stream: { $type: "number" } } },
  { $sort: { Stream: -1 } },
  { $limit: 20 },
  { $out: { db: "ich_edit", coll: "top20spotify_name" } }
])

Замените name личным суффиксом, чтобы коллекция была уникальной.