Чтение и операторы запроса

Как формулировать условия поиска: от простого равенства до составных логических фильтров.

Фильтр — это документ-условие, который вы передаёте в find; MongoDB вернёт документы, ему удовлетворяющие.

Простое равенство

Самый базовый фильтр — пара «поле: значение». Найти всех из Казани:

db.users.find({ city: "Казань" })

Можно комбинировать несколько полей — они соединяются по «И» неявно. Это «из Казани И возраст 28»:

db.users.find({ city: "Казань", age: 28 })

Операторы сравнения

Для «больше/меньше» нужны операторы — они начинаются с $ и пишутся как вложенный объект у поля:

ОператорСмысл
$eqравно (то же, что просто значение)
$neне равно
$gt / $gteбольше / больше или равно
$lt / $lteменьше / меньше или равно
$inзначение входит в список
$ninзначение НЕ входит в список

Пользователи старше 30 лет:

db.users.find({ age: { $gt: 30 } })

Возраст в диапазоне 25..40 включительно — два оператора на одном поле:

db.users.find({ age: { $gte: 25, $lte: 40 } })

$in — один из списка

Когда нужно «город — любой из нескольких», громоздкий $or заменяет компактный $in:

db.users.find({ city: { $in: ["Казань", "Сочи"] } })

Логические $and и $or

Условия по разным полям и так соединяются по «И». Явный $and нужен редко — например, когда два условия на одно поле. А вот $or необходим, чтобы выразить «ИЛИ»: он принимает массив условий, и подходит документ, удовлетворяющий хотя бы одному:

db.users.find({
  $or: [
    { city: "Москва" },
    { age: { $lt: 25 } }
  ]
})

Это «из Москвы ИЛИ моложе 25». Можно вкладывать: общее условие снаружи, $or внутри — «из Казани И (моложе 25 ИЛИ старше 40)».

db.users.find({
  city: "Казань",
  $or: [ { age: { $lt: 25 } }, { age: { $gt: 40 } } ]
})

Проверка наличия поля: $exists

Поскольку схема гибкая, у части документов поле может отсутствовать. Оператор $exists фильтрует по самому факту наличия поля:

db.users.find({ email: { $exists: true } })   // у кого есть email
db.users.find({ phone: { $exists: false } })  // у кого нет телефона

Итог

  • Простой фильтр — «поле: значение»; несколько полей соединяются по «И» автоматически.
  • Сравнения задают операторами $gt, $lt, $gte, $lte, $ne; $in проверяет вхождение в список.
  • $or выражает «ИЛИ»; $exists проверяет наличие поля — это особенно полезно при гибкой схеме.
Проверьте себя
1. Как найти документы, где поле age больше 30?
A{ age > 30 }
B{ age: { $gt: 30 } }
C{ age: $gt 30 }
D{ $gt: { age: 30 } }
2. Что делает оператор $in?
AПроверяет, что значение входит в указанный список
BСоединяет условия по И
CПроверяет наличие поля
DСчитает количество документов
3. Зачем нужен оператор $exists?
AЧтобы сравнить два поля между собой
BЧтобы отфильтровать документы по наличию или отсутствию поля
CЧтобы создать новое поле
DЧтобы удалить поле
4. Как выразить условие «город — Москва ИЛИ возраст меньше 25»?
AПеречислить оба поля в одном объекте через запятую
BИспользовать массив условий в $or
CИспользовать $and
DИспользовать $in
Поддержать проект