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

✅ Решения

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

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

Практикум 15 закрепляет фильтры MongoDB на коллекции ich.imdb.

Основные инструменты: find(), countDocuments(), sort(), limit() и проекция полей.

Отсутствие режиссёра проверяется через $exists: false или через аккуратную проверку пустого массива, если поле есть.

Фильмы США и Франции ищутся по массиву countries через $all.

Китайский или французский язык удобно искать через $in в поле languages.

Жанры Mystery и Sci-Fi вместе требуют $all, а вариант ИЛИ — $in.

Для максимального рейтинга нужно исключить документы без imdb.rating и отсортировать по убыванию.

Топ-3 ошибки: путать $all и $in, сортировать строковые годы как числа без проверки типа, считать документы через find().length вместо countDocuments().

Пошаговые решения

Решение 1

db.imdb.find({ $or: [{ directors: { $exists: false } }, { directors: { $size: 0 } }] })

Проверяются два частых варианта отсутствия режиссёра: поля нет или массив пустой.

Решение 2

db.imdb.find({ countries: { $all: ["USA", "France"] } })

$all требует обе страны в одном массиве countries.

Решение 3

db.imdb.find({ languages: "Chinese" })

Для массива допустима короткая форма: MongoDB ищет элемент массива.

Решение 4

db.imdb.find({ languages: { $in: ["Chinese", "French"] } })

$in соответствует условию «китайский или французский».

Решение 5

db.imdb.find({ genres: { $all: ["Mystery", "Sci-Fi"] } })

Оба жанра должны присутствовать одновременно.

Решение 6

db.imdb.find({ genres: { $in: ["Mystery", "Sci-Fi"] } })

Достаточно одного из двух жанров.

Решение 7

db.imdb.find({ "imdb.rating": { $exists: false } }).sort({ year: -1 }).limit(1)

Сначала исключаем фильмы с рейтингом, затем берём самый новый по year.

Решение 8

db.imdb.find({ title: "Berlin Alexanderplatz" }, { _id: 0, runtime: 1, type: 1 })

Проекция оставляет только нужные поля.

Решение 9

db.imdb.find({ type: "series", runtime: { $exists: true } }).sort({ runtime: -1 }).limit(1)

Сортировка по убыванию runtime ставит самый длинный сериал первым.

Решение 10

db.imdb.find({ "imdb.rating": { $exists: true, $ne: "" } }).sort({ "imdb.rating": -1 }).limit(1)

Пустые значения нужно убрать до сортировки.

Решение 11

db.imdb.find({ year: "1989", "imdb.rating": { $exists: true, $ne: "" } }).sort({ "imdb.rating": -1 }).limit(10)

В источнике для imdb year встречается как текст, поэтому год записан строкой.

Решение 12

db.imdb.countDocuments({ "awards.wins": 2 })

countDocuments() возвращает число документов, а не сами фильмы.