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

💻 Примеры

📁 Блок: MongoDB / Atlas и наполнение коллекций ⏱️ Время изучения: ~90 мин 🎯 Сложность: Средняя

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

Вторая часть 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 самых дорогих объектах.