MongoDB не является классической реляционной системой управления базами данными. Это выражается в большом количестве аспектов: принципах построения БД, формате хранящихся данных, принципе масштабирования БД и языке составления запросов.
Основной язык для создания запросов к реляционным базам данных — это SQL. В MongoDB запросы составляются с помощью собственного синтаксиса. В этом материале мы расскажем, как создавать запросы и какие команды для этого используются.
DBaaS
База данных 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.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()
Вывод:
Также документы можно просмотреть в графическом клиенте:
Поиск по критериям
Чтобы найти документ с конкретным набором параметров, необходимо передать их в качестве параметров запрос find(). Например, найдем сотрудника с зарплатой 50000:
db.employees.find({salary: 50000})
Если параметров несколько, их нужно перечислить через запятую:
db.employees.find({salary: 50000, name: 'Andrew'})
Find с условием ИЛИ
Для задания условия ИЛИ в поиске используется $or:
db.employees.find({$or: [{salary: 50000},{name: 'Alexei'}]})
Поиск со сравнением
Для сравнения используются следующие операторы сравнения:
В качестве примера найдем людей с зарплатой больше 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, которые покрывают основную работу с документами.
Мы работали с базой данных, размещенной на локальном хосте. Вы можете разместить базу данных в облаке с помощью услуги Timeweb Cloud «Облачные базы данных». Такие базы данных проще администрировать и масштабировать, а управлять и создавать новые можно с помощью веб-интерфейса.