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

✅ Решения

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

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

Практикум 17 закрепляет MongoDB Atlas, Compass, mongosh, импорт CSV, текстовые и составные индексы.

Первая задача: выбрать фильмы и сериалы с IMDb рейтингом 8 и выше, отсортировать по рейтингу и записать 50 документов в highly_rated_movies.

Если работа идёт в общей базе ich_edit, к имени новой коллекции нужно добавить своё имя для уникальности.

Вторая часть практикума: импортировать BankChurners.csv в credit_cards и исключить четыре последних технических столбца.

Для поля Education_Level создаётся text index, затем выполняется $text поиск и проверяется explain-план.

Составной индекс Education_Level + Customer_Age должен помогать фильтрации и сортировке по этим полям.

Второй составной индекс Income_Category + Total_Trans_Amt нужен для запросов по доходу и сумме транзакций.

Топ-3 ошибки: не уникализировать имя коллекции, импортировать лишние Naive_Bayes поля, проверять индекс без explain().

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

highly_rated_movies

db.movies.aggregate([
  { $match: { "imdb.rating": { $gte: 8 } } },
  { $sort: { "imdb.rating": -1 } },
  { $limit: 50 },
  { $out: "highly_rated_movies" }
])

Порядок стадий соответствует условию: фильтр, сортировка, ограничение, запись результата.

Импорт BankChurners.csv

Compass: Add Data → Import JSON or CSV → выбрать BankChurners.csv → снять четыре последних поля → Import

Источник требует исключить технические Naive_Bayes и ratio-поля. После импорта проверьте один документ в credit_cards.

Text index и поиск

db.credit_cards.createIndex({ Education_Level: "text" })

db.credit_cards.find({ $text: { $search: "Graduate" } })

Поле Education_Level становится доступным для текстового поиска через $text.

Проверка explain

db.credit_cards.find({
  $text: { $search: "Graduate" }
}).explain("executionStats")

В execution plan проверьте, что используется индекс. Если видите COLLSCAN, пересоздайте индекс или проверьте запрос.

Education_Level + Customer_Age

db.credit_cards.createIndex({ Education_Level: 1, Customer_Age: 1 })

db.credit_cards.find({ Education_Level: "Graduate" })
  .sort({ Customer_Age: 1 })

Фильтр использует первый ключ составного индекса, сортировка — второй.

Income_Category + Total_Trans_Amt

db.credit_cards.createIndex({ Income_Category: 1, Total_Trans_Amt: -1 })

db.credit_cards.find({ Income_Category: "$60K - $80K" })
  .sort({ Total_Trans_Amt: -1 })

Индекс соответствует запросу: равенство по категории дохода и сортировка по сумме транзакций.