Условные операторы задают условие, которому должно соответствовать значение поля документа:
$eq (равно)
$ne (не равно)
$gt (больше чем)
$lt (меньше чем)
$gte (больше или равно)
$lte (меньше или равно)
$in определяет массив значений, одно из которых должно иметь поле документа
$nin определяет массив значений, которые не должно иметь поле документа
Например, найдем все документы, у которых значение ключа age меньше 30:
db.users.find ({age: {$lt : 30}})
Аналогично будет использование других операторов сравнения. Например, тот же ключ, только больше 30:
db.users.find ({age: {$gt : 30}})
Обратите внимание, что сравнение здесь проводится над целочисленными типами, а не строками. Если ключ age представляет строковые значения,
то соответственно надо проводить сравнение над строками: db.users.find ({age: {$gt : "30"}})
, однако результат будет тем же.
Но представим ситуацию, когда нам надо найти все объекты со значением поля age больше 30, но меньше 50. В этом случае мы можем комбинировать два оператора:
db.users.find ({age: {$gt : 30, $lt: 50}})
Найдем пользователей, возраст которых равен 22:
db.users.find ({age: {$eq : 22}})
По сути это аналогия следующего запроса:
db.users.find ({age: 22})
Обратная операция - найдем пользователей, возраст которых НЕ равен 22:
db.users.find ({age: {$ne : 22}})
Оператор $in определяет массив возможных выражений и ищет те ключи, значение которых имеется в массиве:
db.users.find ({age: {$in : [22, 32]}})
Противоположным образом действует оператор $nin - он определяет массив возможных выражений и ищет те ключи, значение которых отсутствует в этом массиве:
db.users.find ({age: {$nin : [22, 32]}})
Логические операторы выполняются над условиями выборки:
$or: соединяет два условия, и документ должен соответствовать одному из этих условий
$and: соединяет два условия, и документ должен соответствовать обоим условиям
$not: документ должен НЕ соответствовать условию
$nor: соединяет два условия, и документ должен НЕ соответстовать обоим условиям
Оператор $or представляет логическую операцию ИЛИ и определяет набор пар ключ-значение, которые должны иметься в документе. И если документ имеет хоть одну такую пару ключ-значение, то он соответствует данному запросу и извлекается из бд:
db.users.find ({$or : [{name: "Tom"}, {age: 22}]})
Это выражение вернет нам все документы, в которых либо name=Tom, либо age=22.
Другой пример вернет нам все документы, в которых name=Tom, а age равно либо 22, либо среди значений languages есть "german":
db.users.find ({name: "Tom", $or : [{age: 22}, {languages: "german"}]})
В подвыраженях or можно применять условные операторы:
db.users.find ({$or : [{name: "Tom"}, {age: {$gte:30}}]})
В данном случае мы выбираем все документы, где name="Tom" или поле age имеет значение от 30 и выше.
Оператор $and представляет логическую операцию И (логическое умножение) и определяет набор критериев, которым обязательно должен соответствовать документ. В отличие от оператора $or документ должен соответствовать всем указанным критериям. Например:
db.users.find ({$and : [{name: "Tom"}, {age: 22}]})
Здесь выбираемые документы обязательно должны имееть имя Tom и возраст 22 - оба этих признака.
Ряд операторов предназначены для работы с массивами:
$all: определяет набор значений, которые должны иметься в массиве
$size: определяет количество элементов, которые должны быть в массиве
$elemMatch: определяет условие, которым должны соответствовать элемены в массиве
Оператор $all определяет массив возможных выражений и требует, чтобы документы имели весь определяемый набор выражений. Соответственно он применяется для поиску по массиву. Например, в документах есть массив languages, хранящий иностранные языки, на которых говорит пользователь. И чтобы найти всех людей, говорящих одновременно и по-английски, и по-французски, мы можем использовать следующее выражение:
db.users.find ({languages: {$all : ["english", "french"]}})
Оператор $elemMatch позволяет выбрать документы, в которых массивы содержат элементы, попадающие под определенные условия. Например, пусть в базе данных будет коллекция, которая содержит оценки пользователей по определенным курсам. Добавим несколько документов:
db.grades.insertMany([{student: "Tom", courses:[{name: "Java", grade: 5}, {name: "MongoDB", grade: 4}]}, {student: "Alice", courses:[{name: "C++", grade: 3}, {name: "MongoDB", grade: 5}]}])
Каждый документ имеет массив courses, который в свою очередь состоит из вложенных документов.
Теперь найдем студентов, которые для курса MongoDB имеют оценку выше 4:
db.grades.find({courses: {$elemMatch: {name: "MongoDB", grade: {$gt: 4}}}})
Оператор $size используется для нахождения документов, в которых массивы имеют число элементов, равным значению $size. Например, извлечем все документы, в которых в массиве laguages два элемента:
db.users.find ({languages: {$size:2}})
Такой запрос будет соответствовать, например, следующему документу:
{"name": "Tom", "age": 32, languages: ["english", "german"]}
Оператор $exists позволяет извлечь только те документы, в которых определенный ключ присутствует или отсутствует. Например, вернем
все документы, в который есть ключ company
:
db.users.find ({company: {$exists:true}})
Если мы укажем у оператора $exists в качестве параметра false
, то запрос вернет нам только те документы, в которых не определен
ключ company.
Оператор $type извлекает только те документы, в которых определенный ключ имеет значение определенного типа, например, строку или число:
db.users.find ({age: {$type:"string"}}) db.users.find ({age: {$type:"number"}})
Оператор $regex задает регулярное выражение, которому должно соответствовать значение поля. Например, пусть поле name обязательно имеет букву "b":
db.users.find ({name: {$regex:"b"}})
Важно понимать, что $regex принимает не просто строки, а именно регулярные выражения, например: name: {$regex:"om$"}
-
значение name должно оканчиваться на "om".