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

💻 Примеры

📁 Блок: 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().

Рабочие примеры

Топ-50 фильмов и сериалов

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

Сначала отсекаем документы ниже 8, потом сортируем и только после этого ограничиваем результат 50 документами.

Text index по Education_Level

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

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

Text index нужен именно для текстового поиска. Обычный индекс по строковому полю не заменяет оператор $text.

Проверка индекса

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

В плане выполнения нужно искать использование текстового индекса. Если виден COLLSCAN, запрос не использует индекс.

Составной индекс для фильтра и сортировки

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

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

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

Индекс по доходу и транзакциям

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

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

Такой индекс соответствует практическому запросу: категория дохода плюс сортировка по сумме транзакций.