ВУЗ: Не указан
Категория: Не указан
Дисциплина: Не указана
Добавлен: 12.01.2024
Просмотров: 46
Скачиваний: 1
ВНИМАНИЕ! Если данный файл нарушает Ваши авторские права, то обязательно сообщите нам.
1 | > db.users.find ({age: {$gt : 30, $lt: 50}}) |
Найдем пользователей, возраст которых равен 22:
1 | > db.users.find ({age: {$eq : 22}}) |
По сути это аналогия следующего запроса:
1 | > db.users.find ({age: 22}) |
Обратная операция - найдем пользователей, возраст которых НЕ равен 22:
1 | > db.users.find ({age: {$ne : 22}}) |
Оператор $in определяет массив возможных выражений и ищет те ключи, значение которых имеется в массиве:
1 | > db.users.find ({age: {$in : [22, 32]}}) |
Противоположным образом действует оператор $nin - он определяет массив возможных выражений и ищет те ключи, значение которых отсутствует в этом массиве:
1 | > db.users.find ({age: {$nin : [22, 32]}}) |
Логические операторы
Логические операторы выполняются над условиями выборки:
-
$or: соединяет два условия, и документ должен соответствовать одному из этих условий -
$and: соединяет два условия, и документ должен соответствовать обоим условиям -
$not: документ должен НЕ соответствовать условию -
$nor: соединяет два условия, и документ должен НЕ соответстовать обоим условиям
Оператор $or
Оператор $or представляет логическую операцию ИЛИ и определяет набор пар ключ-значение, которые должны иметься в документе. И если документ имеет хоть одну такую пару ключ-значение, то он соответствует данному запросу и извлекается из бд:
1 | > db.users.find ({$or : [{name: "Tom"}, {age: 22}]}) |
Это выражение вернет нам все документы, в которых либо name=Tom, либо age=22.
Другой пример вернет нам все документы, в которых name=Tom, а age равно либо 22, либо среди значений languages есть "german":
1 | > db.users.find ({name: "Tom", $or : [{age: 22}, {languages: "german"}]}) |
В подвыраженях or можно применять условные операторы:
1 | > db.users.find ({$or : [{name: "Tom"}, {age: {$gte:30}}]}) |
В данном случае мы выбираем все документы, где name="Tom" или поле age имеет значение от 30 и выше.
Оператор $and
Оператор $and представляет логическую операцию И (логическое умножение) и определяет набор критериев, которым обязателньо должен соответствовать документ. В отличие от оператора $or документ должен соответствовать всем указанным критериям. Например:
1 | > db.users.find ({$and : [{name: "Tom"}, {age: 32}]}) |
Здесь выбираемые документы обязательно должны имееть имя Tom и возраст 32 - оба этих признака.
Поиск по массивам
Ряд операторов предназначены для работы с массивами:
-
$all: определяет набор значений, которые должны иметься в массиве -
$size: определяет количество элементов, которые должны быть в массиве -
$elemMatch: определяет условие, которым должны соответствовать элемены в массиве
$all
Оператор $all определяет массив возможных выражений и требует, чтобы документы имели весь определяемый набор выражений. Соответственно он применяется для поиску по массиву. Например, в документах есть массив languages, хранящий иностранные языки, на которых говорит пользователь. И чтобы найти всех людей, говорящих одновременно и по-английски, и по-французски, мы можем использовать следующее выражение:
1 | > db.users.find ({languages: {$all : ["english", "french"]}}) |
Оператор $elemMatch
Оператор $elemMatch позволяет выбрать документы, в которых массивы содержат элементы, попадающие под определенные условия. Например, пусть в базе данных будет коллекция, которая содержит оценки пользователей по определенным курсам. Добавим несколько документов:
1 2 | > 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 имеют оценку выше 3:
1 | > db.grades.find({courses: {$elemMatch: {name: "MongoDB", grade: {$gt: 3}}}}) |
Оператор $size
Оператор $size используется для нахождения документов, в которых массивы имеют число элементов, равным значению $size. Например, извлечем все документы, в которых в массиве laguages два элемента:
1 | > db.users.find ({languages: {$size:2}}) |
Такой запрос будет соответствовать, например, следующему документу:
1 | {"name": "Tom", "age": 32, languages: ["english", "german"]} |
Оператор $exists
Оператор $exists позволяет извлечь только те документы, в которых определенный ключ присутствует или отсутствует. Например, вернем все документы, в который есть ключ company:
1 | > db.users.find ({company: {$exists:true}}) |
Если мы укажем у оператора $exists в качестве параметра false, то запрос вернет нам только те документы, в которых не определен ключ company.
Оператор $type
Оператор $type извлекает только те документы, в которых определенный ключ имеет значение определенного типа, например, строку или число:
1 2 | > db.users.find ({age: {$type:"string"}}) > db.users.find ({age: {$type:"number"}}) |
Оператор $regex
Оператор $regex задает регулярное выражение, которому должно соответствовать значение поля. Например, пусть поле name обязательно имеет букву "b":
1 | > db.users.find ({name: {$regex:"b"}}) |
Важно понимать, что $regex принимает не просто строки, а именно регулярные выражения, например: name: {$regex:"om$"} - значение name должно оканчиваться на "om".
-
Работа с данными в MongoDB Compass
Для базовых операций, как то: создание/удаление коллекций, добавление, просмотр, изменения и удаления документов есть соответствующие элементы графического интерфейса:
При выборе определенной коллекции и отображении ее данных над список данных есть кнопка для добавления данных, в том числе для импорта из внешнего файла. А напротив каждого документа есть опции для его просмотра, изменения и удаления:
Но несмотря на наличие графических возможностей для управления данными, они могут оказаться недостаточными для каких-то более сложных сценариев работы с данными. И для этого в MongoDB Compass есть встроенный консольный клиент
Mongosh, в котором можно вводить почти все те же команды для работы с данными, что и в консольной оболочке mongo:
Но также стоит отметить, что консольный клиент в Compass несколько упрощает написание запросов. Прежде всего, можно копировать и вставлять запросы в mongosh. Также mongosh имеет функцию автодополнения, которая позволяет нам предложить варианты доступых функций: