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 имеет примерно такую структуру:
Запросы на уровне баз данных и коллекций
Мы будем писать и составлять запросы в Mongodb Compass. Подробнее об установке MongoDB на различные операционные системы можно прочитать в статье «Установка MongoDB на разные ОС: Windows, Ubuntu, CentOS». После установки на локальном сервере будет размещено 3 базы данных:
Чтобы вывести их воспользуемся запросом 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()
Вывод:
Также документы можно просмотреть в графическом клиенте:
Поиск по критериям
Чтобы найти документ с конкретным набором параметров, необходимо передать их в качестве параметров запрос find(). Например, найдем сотрудника с зарплатой 50000:
db.employees.find({salary: 50000})
Если параметров несколько, их нужно перечислить через запятую:
db.employees.find({salary: 50000, name: 'Andrew'})
Find с условием ИЛИ
Для задания условия ИЛИ в поиске используется $or:
db.employees.find({$or: [{salary: 50000},{name: 'Alexei'}]})
Поиск со сравнением
Для сравнения используются следующие операторы сравнения:
$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}})
Сортировка
Для сортировки используется метод sort(). На вход он принимает параметр, на основе которого будет отсортирован вывод и число: 1 для сортировки по возрастанию или -1 для сортировки по убыванию. Отсортируем сотрудников по возрасту:
db.employees.find().sort({age:1})
Limit
Чтобы ограничить количество документов в выводе, используется метод limit():
db.employees.find().sort({age:1}).limit(2)
Обновление документов
Чтобы обновить документы в базе данных MongoDB, используется запрос update(). На вход принимает два параметра. Первый параметр указывает на то, какие документы необходимо обновить. Второй параметр сообщает, какие поля нужно изменить и на что.
Вот пример запроса:
db.employees.update({name: 'Ivan'},
{
$set:{
name: 'Anatoly',
age: 50,
date_of_birth: '15.11.1972'}
})
db.employees.find({name: 'Anatoly'})
Для изменения названия полей используется параметр $rename:
db.employees.updateMany({},
{
$rename:{
name: 'first_name'}
})
В данном случае мы используем 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()
Оптимизация запросов MongoDB
Чтобы ваши запросы выполнялись быстрее, руководствуйтесь следующими советами:
- Для часто используемых запросов создайте индексы.
- Ограничьте количество выводимых документов. MongoDB возвращают в результате поиска все найденные документы. Если вы хотите просмотреть только часть ответа, то используете в запросе метод
limit(). - Если вам нужны не все поля в документах, то вы можете повысить производительность запроса, возвращая в качестве результата поиска только нужные поля.
- Используйте более «избирательные» запросы. Например, проверка по
_idвернет не больше одного документа. Стремитесь использовать в запросах параметры, которые наиболее точно описывают нужные вам документы.
Подготовили для вас выгодные тарифы на облачные серверы
477 ₽/мес
657 ₽/мес
Заключение
MongoDB предоставляет пользователям несложный синтаксис запросов, который позволяет эффективно работать с документами в базах данных. В этом материале мы рассмотрели базовые запросы в MongoDB, которые покрывают основную работу с документами.
Мы работали с базой данных, размещенной на локальном хосте. Вы можете разместить базу данных в облаке с помощью услуги Timeweb Cloud «Облачные базы данных». Такие базы данных проще администрировать и масштабировать, а управлять и создавать новые можно с помощью веб-интерфейса.
