← К оглавлению занятия
⚡ Кратко: суть занятия
Вторая часть Atlas переносит акцент с индексов на наполнение коллекций и запись результата aggregation.
Коллекция students создаётся через insertMany из CSV-подобной таблицы.
Выпускников можно выбрать через $match по году обучения и записать в новую коллекцию через $out.
$out записывает результат pipeline в коллекцию, поэтому перед запуском нужно понимать, куда попадут данные.
Задание с airbnb_Istanbul и airbnb_manhattan100 тренирует геофильтр, сортировку и экспорт результата.
Для Manhattan используется Polygon в address.location и сортировка price: -1.
Для топ-100 нужна стадия $limit: 100 перед $out.
Топ-3 ошибки: забыть создать/проверить коллекцию назначения, поставить $out не последней стадией, скопировать типографские кавычки вместо обычных.
Рабочие примеры
Создание students
db.students.insertMany([
{ sID: 22001, name: "Alex", year: 1, score: 4.0 },
{ sID: 21001, name: "bernie", year: 2, score: 3.7 },
{ sID: 20010, name: "Chris", year: 3, score: 2.5 },
{ sID: 22021, name: "Drew", year: 1, score: 3.2 },
{ sID: 17301, name: "harley", year: 6, score: 3.1 },
{ sID: 21022, name: "Farmer", year: 1, score: 2.2 },
{ sID: 20020, name: "george", year: 3, score: 2.8 },
{ sID: 18020, name: "Harley", year: 5, score: 2.8 }
])
Так CSV из источника превращается в документы MongoDB.
graduated_students
db.students.aggregate([
{ $match: { year: { $gte: 5 } } },
{ $out: "graduated_students" }
])
Результат фильтра записывается в отдельную коллекцию.
airbnb_Istanbul
db.listingsAndReviews.aggregate([
{ $match: { "address.market": "Istanbul" } },
{ $out: "airbnb_Istanbul" }
])
Если в sample_airbnb используется другое поле города, проверьте структуру документа в Compass.
Manhattan polygon
db.listingsAndReviews.aggregate([
{
$match: {
"address.location": {
$geoWithin: {
$geometry: {
type: "Polygon",
coordinates: [[
[-74.01031661494896, 40.72303673998613],
[-74.00889777911645, 40.758664158075085],
[-73.98085696476842, 40.797173401766926],
[-73.91194748047188, 40.89512463545285],
[-73.86843053602587, 40.80167959074328],
[-73.91387167938187, 40.798784001338106],
[-73.93967963759313, 40.775012400678676],
[-73.97612551458131, 40.71294520283255],
[-74.01313477279642, 40.69780167666112],
[-74.01831395595251, 40.72128967713436],
[-74.01031661494896, 40.72303673998613]
]]
}
}
}
}
},
{ $sort: { price: -1 } },
{ $limit: 100 },
{ $out: "airbnb_manhattan100" }
])
Источник показывает $match, $sort и $out; $limit: 100 добавлен по условию задания о 100 самых дорогих объектах.