← К оглавлению занятия
⚡ Кратко: суть занятия
Практикум 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 })
Индекс соответствует запросу: равенство по категории дохода и сортировка по сумме транзакций.