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