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

💻 Примеры

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

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

CAP-теорема описывает ограничения распределённых систем данных.

Consistency: все узлы видят одинаковые данные в одинаковый момент времени.

Availability: отказ узлов не мешает системе отвечать на запросы.

Partition Tolerance: система продолжает работать при разделении сети.

В распределённой системе можно гарантировать только два свойства из трёх.

ACID описывает надёжность транзакций: Atomicity, Consistency, Isolation, Durability.

Практика закрепляет aggregation на trips, companies, shipwrecks и restaurants.

Домашка 18: средняя цена на Гавайях и фильмы с imdb > 8 за 2015–2023 годы.

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

Средняя цена на Гавайях через market

db.listingsAndReviews.aggregate([
  { $match: { "address.market": { $in: ["Oahu", "Maui", "Kauai", "The Big Island"] } } },
  { $group: { _id: null, avgPrice: { $avg: "$price" } } }
])

Источник разрешает перечислить возможные острова в поле market. Набор market нужно проверить по данным Atlas.

Фильмы imdb > 8 за 2015–2023

db.movies.aggregate([
  { $match: { "imdb.rating": { $gt: 8 }, year: { $gte: 2015, $lte: 2023 } } },
  { $sort: { "imdb.rating": -1 } },
  { $group: { _id: null, count: { $sum: 1 }, topMovie: { $first: "$$ROOT" } } }
])

Фильтр ограничивает период и рейтинг, сортировка ставит лучший фильм первым, $group одновременно считает количество и сохраняет topMovie.

Самая старая компания

db.companies.find(
  { founded_year: { $type: "number" } },
  { name: 1, founded_year: 1 }
).sort({ founded_year: 1 }).limit(1)

Чем меньше founded_year, тем старше компания.

Бермудский треугольник

db.shipwrecks.find({
  coordinates: {
    $geoWithin: {
      $geometry: {
        type: 'Polygon',
        coordinates: [[[-64.785825, 32.294164], [-66.057884, 18.415753], [-77.323494, 25.046813], [-81.403103, 30.278911], [-64.785825, 32.294164]]]
      }
    }
  }
})

Координаты взяты из источника; порядок в GeoJSON — longitude, latitude.

Лучший кошерный ресторан в Бруклине

db.restaurants.aggregate([
  { $match: { borough: "Brooklyn", cuisine: "Jewish/Kosher" } },
  { $unwind: "$grades" },
  { $group: { _id: "$name", totalScore: { $sum: "$grades.score" } } },
  { $sort: { totalScore: -1 } },
  { $limit: 1 }
])

Разворачиваем grades, суммируем оценки и берём ресторан с максимальной суммой.