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

✅ Решения

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

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

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

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

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

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

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

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

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

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

Решения с пояснениями

CAP коротко

Consistency + Availability + Partition Tolerance нельзя полностью гарантировать одновременно.

При сетевом разделении система обычно выбирает между строгой согласованностью и доступностью.

ACID коротко

Atomicity — всё или ничего
Consistency — корректное состояние
Isolation — транзакции не мешают друг другу
Durability — результат сохраняется после commit

ACID относится к надёжности транзакций, CAP — к распределённым системам.

Основная возрастная аудитория

db.trips.aggregate([
  { $match: { "birth year": { $type: "number" } } },
  { $project: { age: { $subtract: [2026, "$birth year"] } } },
  { $group: { _id: "$age", rides: { $sum: 1 } } },
  { $sort: { rides: -1 } },
  { $limit: 1 }
])

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

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

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

Сортировка по founded_year по возрастанию выводит самую раннюю дату первой.

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

db.shipwrecks.countDocuments({
  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.listingsAndReviews.aggregate([
  { $match: { "address.market": { $in: ["Oahu", "Maui", "Kauai", "The Big Island"] } } },
  { $group: { _id: null, avgPrice: { $avg: "$price" } } }
])

Два этапа из подсказки источника: $match и $group.

Фильмы imdb > 8

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

Так получаем и количество, и фильм с максимальным рейтингом.