← К оглавлению занятия
⚡ Кратко: суть занятия
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, суммируем оценки и берём ресторан с максимальной суммой.