Истории успеха наших клиентов — лучшие проекты
Вход/ Регистрация

Как работать с запросами MongoDB: оптимизация, примеры

6507
7 минут чтения
Средний рейтинг статьи: 4.5

MongoDB не является классической реляционной системой управления базами данными. Это выражается в большом количестве аспектов: принципах построения БД, формате хранящихся данных, принципе масштабирования БД и языке составления запросов.

Основной язык для создания запросов к реляционным базам данных — это SQL. В MongoDB запросы составляются с помощью собственного синтаксиса. В этом материале мы расскажем, как создавать запросы и какие команды для этого используются. 

DBaaS

Запустите свою базу данных в облаке и
оптимизируйте процессы DevOps и CI/CD.

Структура MongoDB

База данных MongoDB состоит из коллекций — подобия таблиц в реляционных БД. У каждой коллекции своё уникальное имя. В отличии от табличных БД, у коллекций нет строгой структуры данных с четким количеством столбцов и типом данных. 

В коллекциях хранятся документы — это объекты, по своему формату напоминающие JSON. Документ с информацией о сотруднике может выглядеть примерно так:

    
{ name: "Ivan", patronymic: "Sergeevich", surname: "Antonov", age: "25", salary: "100000", department: "marketing", date of birth: "15.02.1997" }

Информация в документах может быть представлена в различных типах данных. В нашем случае все данные описаны в виде строк. Обобщая база данных MongoDB имеет примерно такую структуру:

Image4

Запросы на уровне баз данных и коллекций 

Мы будем писать и составлять запросы в Mongodb Compass. Подробнее об установке MongoDB на различные операционные системы можно прочитать в статье «Установка MongoDB на разные ОС: Windows, Ubuntu, CentOS». После установки на локальном сервере будет размещено 3 базы данных:

Image8

Чтобы вывести их воспользуемся запросом show databases:

    
show databases
    
admin   40.00 KiB config  60.00 KiB local   40.00 KiB

Также можно использовать сокращенный вариант — show dbs:

    
show dbs
    
admin   40.00 KiB config  60.00 KiB local   40.00 KiB

Чтобы перейти к работе с определенной базой данных используется запрос use:

    
use testdb 'switched to db testdb'

Базы данных с названием testdb на нашем сервере не было. Если терминал при выполнении запроса  use не находит соответствующую БД, то он создает новую с таким же названием. 

Для создания коллекций используется команда db.createCollection ("название коллекции"). Создадим в базе данных testdb коллекцию:

    
db.createCollection('cloud') { ok: 1 } show collections cloud

Чтобы удалить коллекцию используем команду drop():

    
db.cloud.drop() true show collections

Для удаления всей базы данных, во время работы с ней используем запрос db.dropDataBase():

    
db.dropDatabase() 

Вывод:

    
{ ok: 1, dropped: 'testdb' }

Добавление и удаление документов

Восстановим базу данных и создадим в ней коллекцию:

    
use testdb 'switched to db testdb' db.createCollection('employees') { ok: 1 }

И добавим в неё первый документ:

    
db.employees.insert({ name: "Ivan", patronymic: "Sergeevich", surname: "Antonov", age: 25, salary: 100000, department: "marketing", date_of_birth: "15.02.1997" })

Вывод:

    
'DeprecationWarning: Collection.insert() is deprecated. Use insertOne, insertMany, or bulkWrite.' { acknowledged: true, insertedIds: { '0': ObjectId("637c9cbd7025c2523a76fe64") } }

После выполнения insert терминал сообщит, что для оптимизации запросов стоит использовать методы insertOne, insertMany или bulkWrite. insert является устаревшим методом. 

insertOne добавляет в коллекцию один документ:

    
db.employees.insertOne({ name: "Sergey", patronymic: "Valentinovich", surname: "Konopatka", age: 35, salary: 200000, department: "QA", date_of_birth: "12.06.1987" })

Вывод:

    
{ acknowledged: true, insertedId: ObjectId("637ca6127025c2523a76fe65") }

insertMany добавляет массив документов в коллекцию:

    
db.employees.insertMany( [{ name: "Andrew", patronymic: "Stepanovich", surname: "Limonov", age: 19, salary: 50000, department: "Tech Support", date_of_birth: "15.10.2003" }, { name: "Alexei", patronymic: "Vadimovich", surname: "Pasechnikov", age: 43, salary: 300000, department: "HR", date_of_birth: "6.05.1979" }] )

Вывод:

    
{ acknowledged: true insertedIds: { '0': ObjectId("637ca7817025c2523a76fe66"), '1': ObjectId("637ca7817025c2523a76fe67") } }

bulkWrite выполняет несколько операций, связанных со вставкой, удалением и обновлением документов:

    
db.employees.bulkWrite([{ insertOne: {name: "Michail", patronymic: "Bogdanovich", surname: "Gurov", age: 30, salary: 220000, department: "Tech Support", date_of_birth: "10.01.1992" } }])

Вывод:

    
{ acknowledged: true, insertedCount: 1, insertedIds: { '0': ObjectId("637cafaa7025c2523a76fe68") }, matchedCount: 0, modifiedCount: 0, deletedCount: 0, upsertedCount: 0, upsertedIds: {} }

Поиск документов

Запрос find() — это аналог SELECT из SQL. С помощью этого запроса в MongoDB осуществляется поиск и вывод документов коллекции. Для начала выведем все документы в коллекции employees:

    
db.employees.find()

Вывод:

Image1

Также документы можно просмотреть в графическом клиенте:

Image3

Поиск по критериям

Чтобы найти документ с конкретным набором параметров, необходимо передать их в качестве параметров запрос find(). Например, найдем сотрудника с зарплатой 50000:

    
db.employees.find({salary: 50000})

Image10

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

    
db.employees.find({salary: 50000, name: 'Andrew'})

Image9

Find с условием ИЛИ

Для задания условия ИЛИ в поиске используется $or:

    
db.employees.find({$or: [{salary: 50000},{name: 'Alexei'}]})

Image11

Поиск со сравнением

Для сравнения используются следующие операторы сравнения:

  • $lt — less than, меньше;
  • $lte — less than or equal, меньше или равно;
  • $gt — greater than, больше;
  • $gte — greater than or equal, больше или равно;
  • $ne — not equal, не равно.

В качестве примера найдем людей с зарплатой больше 100000 и моложе 30:

    
db.employees.find({salary : {$gte: 100000},age: {$lt:30}})

Image5

Сортировка

Для сортировки используется метод sort(). На вход он принимает параметр, на основе которого будет отсортирован вывод и число: 1 для сортировки по возрастанию или -1 для сортировки по убыванию. Отсортируем сотрудников по возрасту:

    
db.employees.find().sort({age:1})

Image2

Limit

Чтобы ограничить количество документов в выводе, используется метод limit():

    
db.employees.find().sort({age:1}).limit(2)

Image7

Обновление документов

Чтобы обновить документы в базе данных MongoDB, используется запрос update(). На вход принимает два параметра. Первый параметр указывает на то, какие документы необходимо обновить. Второй параметр сообщает, какие поля нужно изменить и на что.

Вот пример запроса:

    
db.employees.update({name: 'Ivan'}, { $set:{ name: 'Anatoly', age: 50, date_of_birth: '15.11.1972'} }) db.employees.find({name: 'Anatoly'})

Image13

Для изменения названия полей используется параметр $rename:

    
db.employees.updateMany({}, { $rename:{ name: 'first_name'} })

Image12

В данном случае мы используем updateMany. По умолчанию update изменяет один документ. Для обновления нескольких документов необходимо использовать updateMany или присвоить параметру multi значение true.

Удаление документов

Для удаления документов в MongoDB предусмотрено 2 функции — deleteOne() и deleteMany().

deleteOne() удалит первый подходящий под критерии документ:

    
db.employees.deleteOne({first_name: 'Alexei'}) { acknowledged: true, deletedCount: 1 }

deleteMany() удалит все подходящие под критерии документы:

    
db.employees.deleteMany({department: 'Tech Support'}) { acknowledged: true, deletedCount: 2 }

В итоге в коллекции employees осталось 2 документа:

    
db.employees.find()

Image6

Оптимизация запросов MongoDB

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

  • Для часто используемых запросов создайте индексы.
  • Ограничьте количество выводимых документов. MongoDB возвращают в результате поиска все найденные документы. Если вы хотите просмотреть только часть ответа, то используете в запросе метод limit().
  • Если вам нужны не все поля в документах, то вы можете повысить производительность запроса, возвращая в качестве результата поиска только нужные поля.
  • Используйте более «избирательные» запросы. Например, проверка по _id вернет не больше одного документа. Стремитесь использовать в запросах параметры, которые наиболее точно описывают нужные вам документы.

Подготовили для вас выгодные тарифы на облачные серверы

Cloud MSK 15

477 ₽/мес

Процессор
1 x 3.3 ГГц
Память
1 ГБ
NVMe
15 ГБ
Канал
1 Гбит/с
Публичный IP
Cloud MSK 30

657 ₽/мес

Процессор
1 x 3.3 ГГц
Память
2 ГБ
NVMe
30 ГБ
Канал
1 Гбит/с
Публичный IP

Заключение

MongoDB предоставляет пользователям несложный синтаксис запросов, который позволяет эффективно работать с документами в базах данных. В этом материале мы рассмотрели базовые запросы в MongoDB, которые покрывают основную работу с документами. 

Мы работали с базой данных, размещенной на локальном хосте. Вы можете разместить базу данных в облаке с помощью услуги Timeweb Cloud «Облачные базы данных». Такие базы данных проще администрировать и масштабировать, а управлять и создавать новые можно с помощью веб-интерфейса.

6507
7 минут чтения
Средний рейтинг статьи: 4.5

Читайте также

Хотите внести свой вклад?
Участвуйте в нашей контент-программе за
вознаграждение или запросите нужную вам инструкцию
img-server
Пока нет комментариев