Бесплатная миграция IT-инфраструктуры в облако

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

Команда Timeweb Cloud
Команда Timeweb Cloud
Наши инженеры, технические писатели, редакторы и маркетологи
22 ноября 2022 г.
4014
7 минут чтения
Средний рейтинг статьи: 4.5

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

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

DBaaS

Структура 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.drobDataBase()»:

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 вернет не больше одного документа. Стремитесь использовать в запросах параметры, которые наиболее точно описывают нужные вам документы.
Подготовили для вас выгодные тарифы на облачные серверы

Заключение

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

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

Хотите внести свой вклад?
Участвуйте в нашей контент-программе за
вознаграждение или запросите нужную вам инструкцию
img-server
22 ноября 2022 г.
4014
7 минут чтения
Средний рейтинг статьи: 4.5
Пока нет комментариев