Решение 1
db.imdb.find({ $or: [{ directors: { $exists: false } }, { directors: { $size: 0 } }] })
Проверяются два частых варианта отсутствия режиссёра: поля нет или массив пустой.
Практикум 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().
db.imdb.find({ $or: [{ directors: { $exists: false } }, { directors: { $size: 0 } }] })
Проверяются два частых варианта отсутствия режиссёра: поля нет или массив пустой.
db.imdb.find({ countries: { $all: ["USA", "France"] } })
$all требует обе страны в одном массиве countries.
db.imdb.find({ languages: "Chinese" })
Для массива допустима короткая форма: MongoDB ищет элемент массива.
db.imdb.find({ languages: { $in: ["Chinese", "French"] } })
$in соответствует условию «китайский или французский».
db.imdb.find({ genres: { $all: ["Mystery", "Sci-Fi"] } })
Оба жанра должны присутствовать одновременно.
db.imdb.find({ genres: { $in: ["Mystery", "Sci-Fi"] } })
Достаточно одного из двух жанров.
db.imdb.find({ "imdb.rating": { $exists: false } }).sort({ year: -1 }).limit(1)
Сначала исключаем фильмы с рейтингом, затем берём самый новый по year.
db.imdb.find({ title: "Berlin Alexanderplatz" }, { _id: 0, runtime: 1, type: 1 })
Проекция оставляет только нужные поля.
db.imdb.find({ type: "series", runtime: { $exists: true } }).sort({ runtime: -1 }).limit(1)
Сортировка по убыванию runtime ставит самый длинный сериал первым.
db.imdb.find({ "imdb.rating": { $exists: true, $ne: "" } }).sort({ "imdb.rating": -1 }).limit(1)
Пустые значения нужно убрать до сортировки.
db.imdb.find({ year: "1989", "imdb.rating": { $exists: true, $ne: "" } }).sort({ "imdb.rating": -1 }).limit(10)
В источнике для imdb year встречается как текст, поэтому год записан строкой.
db.imdb.countDocuments({ "awards.wins": 2 })
countDocuments() возвращает число документов, а не сами фильмы.