CAP коротко
Consistency + Availability + Partition Tolerance нельзя полностью гарантировать одновременно.
При сетевом разделении система обычно выбирает между строгой согласованностью и доступностью.
CAP-теорема описывает ограничения распределённых систем данных.
Consistency: все узлы видят одинаковые данные в одинаковый момент времени.
Availability: отказ узлов не мешает системе отвечать на запросы.
Partition Tolerance: система продолжает работать при разделении сети.
В распределённой системе можно гарантировать только два свойства из трёх.
ACID описывает надёжность транзакций: Atomicity, Consistency, Isolation, Durability.
Практика закрепляет aggregation на trips, companies, shipwrecks и restaurants.
Домашка 18: средняя цена на Гавайях и фильмы с imdb > 8 за 2015–2023 годы.
Consistency + Availability + Partition Tolerance нельзя полностью гарантировать одновременно.
При сетевом разделении система обычно выбирает между строгой согласованностью и доступностью.
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.
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" } } }
])
Так получаем и количество, и фильм с максимальным рейтингом.