Skip to content

Основы MongoDB

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

С самого начала MongoDB была ориентирована на горизонтальное масштабирование. Она автоматически распределяет данные между серверами в кластере, обеспечивает балансировку нагрузки и прозрачна для приложения. Это позволяет легко масштабировать систему без изменения логики приложения.

Несмотря на ориентацию на простоту и масштабируемость, MongoDB обладает богатым набором функций: поддержка различных типов индексов, включая гео- и полнотекстовые; мощный фреймворк агрегации на основе конвейеров; специальные коллекции с ограниченным сроком жизни; встроенное файловое хранилище и др. Однако некоторые функции реляционных СУБД, такие как сложные соединения, поддерживаются ограниченно, чтобы сохранить производительность и упростить работу в распределённых системах.

MongoDB оптимизирована под высокую скорость: она эффективно использует память, применяет современный механизм хранения WiredTiger и активно использует индексы. При этом часть логики может быть передана на клиентскую сторону — осознанное решение ради упрощения архитектуры и повышения скорости.

Главная цель MongoDB — стать быстрым, гибким и масштабируемым хранилищем данных, способным удовлетворить широкий спектр задач без перегрузки лишними возможностями.

Структура БД

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

Документы

Документ в MongoDB — это JSON-подобная структура (на деле используется BSON), содержащая пары ключ–значение. Пример простого документа:

json
{ "greeting": "Hello, world!" }

Документы могут содержать значения разных типов и даже вложенные документы и массивы:

json
{
  "title": "MongoDB Guide",
  "views": 123,
  "tags": ["database", "NoSQL", "MongoDB"],
  "author": {
    "name": "Alex",
    "email": "alex@example.com"
  }
}

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

Коллекции

Коллекция — это набор документов. Она может содержать документы с разной структурой (динамическая схема):

json
{ "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

Используется для обозначения отсутствия значения:

json
{ "x": null }

Boolean (логический тип)

Представляет значения true и false:

json
{ "active": true }

Числа

MongoDB по умолчанию использует числа с плавающей точкой (64-бит). Для целых — явно указываются типы:

json
{ "pi": 3.14 }
{ "count": NumberInt("3") }
{ "big": NumberLong("1234567890123") }

Строки

Любая строка UTF-8:

json
{ "name": "MongoDB" }

Даты

Дата хранится в миллисекундах с 1 января 1970 года. Создание даты:

js
{ "created_at": new Date() }

Внимание

Важно использовать new Date(), иначе получится строка, а не объект даты.

Регулярные выражения

Можно использовать для фильтрации по шаблонам:

json
{ "title": /mongo/i }

Массивы

Массивы в MongoDB могут содержать любые типы данных, включая другие массивы и вложенные документы. Это делает их очень гибкими для хранения списков и структурированных наборов значений.

Пример массива строк:

json
{ "tags": ["mongodb", "nosql", "database"] }

Массив с разными типами:

json
{ "mixed": ["text", 42, true, null] }

Массив с вложенными документами:

json
{
  "comments": [
    { "author": "Alice", "text": "Great post!" },
    { "author": "Bob", "text": "Thanks!" }
  ]
}

Вложенные документы

Вложенные (или встраиваемые) документы позволяют естественно группировать связанные данные.

json
{
  "name": "John Doe",
  "address": {
    "street": "123 Park Street",
    "city": "Springfield",
    "zip": "12345"
  }
}

Здесь поле address содержит вложенный документ с тремя ключами

ObjectId

ObjectId — это специальный тип данных, предназначенный для идентификации документов. Он гарантирует уникальность даже в распределённых системах. При вставке документа в MongoDB, если поле _id не задано, драйвер или сервер сам создаёт значение ObjectId.

Пример документа с ObjectId:

json
{ "_id": ObjectId("64f2c1b1e7f4a2c5e5a58d77"), "name": "Alice" }

ObjectId занимает 12 байт и обычно представляется как 24-символьная шестнадцатеричная строка (hex).

СмещениеРазмерНазначение
0–34 байтаВременная метка (timestamp в секундах)
4-85 байтУникальный идентификатор машины и процесса
9–113 байтаИнкрементный счётчик

Для ObjectId("64f2c1b1e7f4a2c5e5a58d77"):

  • 64f2c1b1 — время создания (Unix timestamp)

  • e7f4a2c5e5 — уникальное значение для машины + процесса

  • a58d77 — счётчик, увеличивается при генерации новых ObjectId

Встроенная временная метка позволяет извлекать приблизительное время создания:

js
ObjectId("64f2c1b1e7f4a2c5e5a58d77").getTimestamp();

Сортировка по времени вставки — документы с ObjectId автоматически упорядочиваются в порядке создания.

Автоматическая генерация _id

MongoDB всегда требует уникальное поле _id в документе. Если вы не указали его явно, MongoDB автоматически создаст ObjectId:

js
db.users.insertOne({ name: "Bob" })
// Автоматически создаст что-то вроде:
{ "_id": ObjectId("64f2c3a7a3f61b57dd123456"), "name": "Bob" }

Если вы зададите своё значение в _id, MongoDB его примет, но оно должно быть уникальным в коллекции:

json
{ "_id": 123, "name": "Carol" }

Реже используемые типы

Binary (двоичные данные)

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

Code

Можно хранить JavaScript-код (редко используется):

json
{ "action": function() { return true; } }

Начало работы

MongoDB Compass — это официальный графический интерфейс (GUI) для работы с MongoDB. Он особенно удобен для начинающих, поскольку позволяет работать с коллекциями и документами без написания кода.

Compass экран приветствия

Для подключения с БД нажмите Add new connection.

Compass настройка соединения - advanced

MongoDB Compass позволяет подключаться как к локальной базе данных, так и к удалённому серверу. Если MongoDB установлена локально и работает по умолчанию, достаточно нажать Connect.

Если вы подключаетесь к облачной базе или серверу в сети, укажите строку подключения вида:

text
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.

Compass настройка соединения - advanced

Обзор интерфейса

После подключения вы попадаете на главную панель, где отображаются все доступные базы данных и коллекции.

Интерфейс Compass

Основные области интерфейса:

  • Навигационная панель слева — список баз данных и коллекций.
  • Основное окно — отображает документы в выбранной коллекции, позволяет выполнять фильтрацию, сортировку и агрегации.
  • Вкладка Documents — просмотр и редактирование документов в коллекции.
  • Вкладка Schema — анализ структуры данных и типов в коллекции.
  • Вкладка Indexes — обзор и создание индексов.
  • Вкладка Aggregation — визуальный редактор для создания агрегирующих запросов.

MongoDB Shell

В MongoDB Compass в правом верхнем углу интерфейса находится кнопка "Open MongoDB Shell", при нажатии на которую открывается новая вкладка внутри Compass — встроенный терминал MongoDB Shell (mongosh).

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

Выполните скрипт:

js
db.runCommand({ connectionStatus: 1 });

Тестовая команда Compass

Этот запрос возвращает информацию о текущем подключении, включая имя пользователя, роли и базу данных.

Аналогично можно подключиться из терминала, используя утилиту mongosh.

Тестовая команда mongosh

Вы познакомились с основами MongoDB, её структурой, типами данных и интерфейсом Compass. Теперь перейдём к практической части — операциям с коллекциями и документами.