Операторы выборки

Последнее обновление: 29.07.2022

Условные операторы

Условные операторы задают условие, которому должно соответствовать значение поля документа:

  • $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

Оператор $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

Оператор $and представляет логическую операцию И (логическое умножение) и определяет набор критериев, которым обязательно должен соответствовать документ. В отличие от оператора $or документ должен соответствовать всем указанным критериям. Например:

db.users.find ({$and : [{name: "Tom"}, {age: 22}]})

Здесь выбираемые документы обязательно должны имееть имя Tom и возраст 22 - оба этих признака.

Поиск по массивам

Ряд операторов предназначены для работы с массивами:

  • $all: определяет набор значений, которые должны иметься в массиве

  • $size: определяет количество элементов, которые должны быть в массиве

  • $elemMatch: определяет условие, которым должны соответствовать элемены в массиве

$all

Оператор $all определяет массив возможных выражений и требует, чтобы документы имели весь определяемый набор выражений. Соответственно он применяется для поиску по массиву. Например, в документах есть массив languages, хранящий иностранные языки, на которых говорит пользователь. И чтобы найти всех людей, говорящих одновременно и по-английски, и по-французски, мы можем использовать следующее выражение:

db.users.find ({languages: {$all : ["english", "french"]}})

Оператор $elemMatch

Оператор $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 используется для нахождения документов, в которых массивы имеют число элементов, равным значению $size. Например, извлечем все документы, в которых в массиве laguages два элемента:

db.users.find ({languages: {$size:2}})

Такой запрос будет соответствовать, например, следующему документу:

{"name": "Tom", "age": 32, languages: ["english", "german"]}

Оператор $exists

Оператор $exists позволяет извлечь только те документы, в которых определенный ключ присутствует или отсутствует. Например, вернем все документы, в который есть ключ company:

db.users.find ({company: {$exists:true}})

Если мы укажем у оператора $exists в качестве параметра false, то запрос вернет нам только те документы, в которых не определен ключ company.

Оператор $type

Оператор $type извлекает только те документы, в которых определенный ключ имеет значение определенного типа, например, строку или число:

db.users.find ({age: {$type:"string"}})
db.users.find ({age: {$type:"number"}})

Оператор $regex

Оператор $regex задает регулярное выражение, которому должно соответствовать значение поля. Например, пусть поле name обязательно имеет букву "b":

db.users.find ({name: {$regex:"b"}})

Важно понимать, что $regex принимает не просто строки, а именно регулярные выражения, например: name: {$regex:"om$"} - значение name должно оканчиваться на "om".

Помощь сайту
Юмани:
410011174743222
Перевод на карту
Номер карты:
4048415020898850