Основы MongoDB
MongoDB — это документоориентированная СУБД общего назначения, спроектированная с прицелом на масштабируемость, гибкость и высокую производительность. Вместо реляционной модели с жёсткой схемой она использует динамичные документы, что упрощает работу с вложенными структурами и ускоряет разработку. Благодаря отсутствию фиксированной схемы разработчики могут легко менять структуру данных и быстро экспериментировать.
С самого начала MongoDB была ориентирована на горизонтальное масштабирование. Она автоматически распределяет данные между серверами в кластере, обеспечивает балансировку нагрузки и прозрачна для приложения. Это позволяет легко масштабировать систему без изменения логики приложения.
Несмотря на ориентацию на простоту и масштабируемость, MongoDB обладает богатым набором функций: поддержка различных типов индексов, включая гео- и полнотекстовые; мощный фреймворк агрегации на основе конвейеров; специальные коллекции с ограниченным сроком жизни; встроенное файловое хранилище и др. Однако некоторые функции реляционных СУБД, такие как сложные соединения, поддерживаются ограниченно, чтобы сохранить производительность и упростить работу в распределённых системах.
MongoDB оптимизирована под высокую скорость: она эффективно использует память, применяет современный механизм хранения WiredTiger и активно использует индексы. При этом часть логики может быть передана на клиентскую сторону — осознанное решение ради упрощения архитектуры и повышения скорости.
Главная цель MongoDB — стать быстрым, гибким и масштабируемым хранилищем данных, способным удовлетворить широкий спектр задач без перегрузки лишними возможностями.
Структура БД
В MongoDB основными единицами хранения являются документы, сгруппированные в коллекции, а коллекции — в базы данных. Вместо фиксированной схемы, как в реляционных СУБД, MongoDB использует гибкую структуру документов, что позволяет легко и быстро работать с разнородными данными.
Документы
Документ в MongoDB — это JSON-подобная структура (на деле используется BSON), содержащая пары ключ–значение. Пример простого документа:
{ "greeting": "Hello, world!" }
Документы могут содержать значения разных типов и даже вложенные документы и массивы:
{
"title": "MongoDB Guide",
"views": 123,
"tags": ["database", "NoSQL", "MongoDB"],
"author": {
"name": "Alex",
"email": "alex@example.com"
}
}
Каждый документ содержит обязательное поле _id, которое уникально в пределах коллекции.
Коллекции
Коллекция — это набор документов. Она может содержать документы с разной структурой (динамическая схема):
{ "greeting": "Hello, world!", "views": 3 }
{ "signoff": "Good night, and good luck" }
Тем не менее, хорошей практикой является разделение документов разных типов по разным коллекциям, чтобы:
- упростить логику запросов,
- ускорить поиск,
- эффективно использовать индексы.
Например:
blog.posts
— коллекция с постами,blog.authors
— коллекция с данными авторов.
Базы данных
MongoDB позволяет создавать несколько баз данных в одном экземпляре сервера. Каждая БД может содержать свои коллекции. Обычно данные одного приложения хранятся в одной базе.
Примеры допустимых имён баз данных: cms
, shop_db
.
В MongoDB существует три специальные базы данных: admin
, local
и config
. Они не удаляются и играют важную роль в работе кластера.
admin
— это административная база данных. Если вы выполняете команду, требующую административных прав (например, добавление пользователя с ролями администратора или запуск команды репликации), MongoDB обращается к этой базе. Авторизация пользователей, команды для настройки шардирования, создания пользователей с глобальными правами — всё это связано сadmin
. Получение прав администратора часто требует аутентификации именно в этой базе данных.local
— база данных, специфичная для каждого узла. Она не реплицируется между членами реплики. Здесь хранятся служебные данные, такие как информация об узле, состояние репликации, операции журналаoplog
. Именно благодаря базеlocal
реплики могут синхронизироваться друг с другом, отслеживая изменения, которые происходят в кластере.config
— используется в шардированных кластерах MongoDB. В ней хранится информация о конфигурации кластера: список шардов, разбивка коллекций на чанки (фрагменты), маршрутизация запросов и другая метаинформация. Эта база данных используется внутренне системой для обеспечения корректной работы шардирования и балансировки нагрузки.
Все три базы не предназначены для хранения пользовательских данных и используются MongoDB самой для своей внутренней работы.
Типы данных
MongoDB поддерживает богатый набор типов данных, выходящий за рамки классического JSON. В этом рерайте кратко рассмотрим основные типы, которые можно использовать в документах MongoDB, и приведём примеры.
Основные типы данных
Null
Используется для обозначения отсутствия значения:
{ "x": null }
Boolean (логический тип)
Представляет значения true
и false
:
{ "active": true }
Числа
MongoDB по умолчанию использует числа с плавающей точкой (64-бит). Для целых — явно указываются типы:
{ "pi": 3.14 }
{ "count": NumberInt("3") }
{ "big": NumberLong("1234567890123") }
Строки
Любая строка UTF-8:
{ "name": "MongoDB" }
Даты
Дата хранится в миллисекундах с 1 января 1970 года. Создание даты:
{ "created_at": new Date() }
Внимание
Важно использовать new Date()
, иначе получится строка, а не объект даты.
Регулярные выражения
Можно использовать для фильтрации по шаблонам:
{ "title": /mongo/i }
Массивы
Массивы в MongoDB могут содержать любые типы данных, включая другие массивы и вложенные документы. Это делает их очень гибкими для хранения списков и структурированных наборов значений.
Пример массива строк:
{ "tags": ["mongodb", "nosql", "database"] }
Массив с разными типами:
{ "mixed": ["text", 42, true, null] }
Массив с вложенными документами:
{
"comments": [
{ "author": "Alice", "text": "Great post!" },
{ "author": "Bob", "text": "Thanks!" }
]
}
Вложенные документы
Вложенные (или встраиваемые) документы позволяют естественно группировать связанные данные.
{
"name": "John Doe",
"address": {
"street": "123 Park Street",
"city": "Springfield",
"zip": "12345"
}
}
Здесь поле address содержит вложенный документ с тремя ключами
ObjectId
ObjectId — это специальный тип данных, предназначенный для идентификации документов. Он гарантирует уникальность даже в распределённых системах. При вставке документа в MongoDB, если поле _id
не задано, драйвер или сервер сам создаёт значение ObjectId.
Пример документа с ObjectId:
{ "_id": ObjectId("64f2c1b1e7f4a2c5e5a58d77"), "name": "Alice" }
ObjectId занимает 12 байт и обычно представляется как 24-символьная шестнадцатеричная строка (hex).
Смещение | Размер | Назначение |
---|---|---|
0–3 | 4 байта | Временная метка (timestamp в секундах) |
4-8 | 5 байт | Уникальный идентификатор машины и процесса |
9–11 | 3 байта | Инкрементный счётчик |
Для ObjectId("64f2c1b1e7f4a2c5e5a58d77")
:
64f2c1b1
— время создания (Unix timestamp)e7f4a2c5e5
— уникальное значение для машины + процессаa58d77
— счётчик, увеличивается при генерации новых ObjectId
Встроенная временная метка позволяет извлекать приблизительное время создания:
ObjectId("64f2c1b1e7f4a2c5e5a58d77").getTimestamp();
Сортировка по времени вставки — документы с ObjectId автоматически упорядочиваются в порядке создания.
Автоматическая генерация _id
MongoDB всегда требует уникальное поле _id
в документе. Если вы не указали его явно, MongoDB автоматически создаст ObjectId:
db.users.insertOne({ name: "Bob" })
// Автоматически создаст что-то вроде:
{ "_id": ObjectId("64f2c3a7a3f61b57dd123456"), "name": "Bob" }
Если вы зададите своё значение в _id
, MongoDB его примет, но оно должно быть уникальным в коллекции:
{ "_id": 123, "name": "Carol" }
Реже используемые типы
Binary (двоичные данные)
Используется для хранения произвольных байтов (например, изображений).
Code
Можно хранить JavaScript-код (редко используется):
{ "action": function() { return true; } }
Начало работы
MongoDB Compass — это официальный графический интерфейс (GUI) для работы с MongoDB. Он особенно удобен для начинающих, поскольку позволяет работать с коллекциями и документами без написания кода.
Для подключения с БД нажмите Add new connection.
MongoDB Compass позволяет подключаться как к локальной базе данных, так и к удалённому серверу. Если MongoDB установлена локально и работает по умолчанию, достаточно нажать Connect.
Если вы подключаетесь к облачной базе или серверу в сети, укажите строку подключения вида:
mongodb+srv://username:password@host/myDatabase
mongodb+srv://
- это URI-схема, указывающая, что соединение будет установлено через DNS SRV-запись. Она автоматически подтягивает адреса всех узлов кластера (реплика-сета), их приоритеты и настройки — удобно для подключения к MongoDB Atlas и другим кластерным конфигурациям. Если используется обычный standalone-сервер, то используется простоmongodb://
.username:password
- это логин и пароль пользователя MongoDB, зарегистрированного в базе.host
- адрес сервера MongoDB./myDatabase
- это имя базы данных, к которой подключаешься по умолчанию. Если не указать базу в строке подключения, MongoDB будет использоватьtest
.
Также можно настроить дополнительные параметры (например, SSL, авторизацию) через вкладку Advanced.
Обзор интерфейса
После подключения вы попадаете на главную панель, где отображаются все доступные базы данных и коллекции.
Основные области интерфейса:
- Навигационная панель слева — список баз данных и коллекций.
- Основное окно — отображает документы в выбранной коллекции, позволяет выполнять фильтрацию, сортировку и агрегации.
- Вкладка
Documents
— просмотр и редактирование документов в коллекции. - Вкладка
Schema
— анализ структуры данных и типов в коллекции. - Вкладка
Indexes
— обзор и создание индексов. - Вкладка
Aggregation
— визуальный редактор для создания агрегирующих запросов.
MongoDB Shell
В MongoDB Compass в правом верхнем углу интерфейса находится кнопка "Open MongoDB Shell", при нажатии на которую открывается новая вкладка внутри Compass — встроенный терминал MongoDB Shell (mongosh
).
MongoDB по умолчанию использует базу данных test
для временной работы, если не указана другая через команду use
. Это безопасная, пустая или неважная база, с которой можно экспериментировать без риска повредить данные.
Выполните скрипт:
db.runCommand({ connectionStatus: 1 });
Этот запрос возвращает информацию о текущем подключении, включая имя пользователя, роли и базу данных.
Аналогично можно подключиться из терминала, используя утилиту mongosh
.
Вы познакомились с основами MongoDB, её структурой, типами данных и интерфейсом Compass. Теперь перейдём к практической части — операциям с коллекциями и документами.