Перейти к содержанию
Innovialabs

Что такое MongoDB и когда её стоит использовать

Основы3 мин

Коротко

MongoDB — документная NoSQL-база, которая хранит данные как JSON-подобные документы в коллекциях без жёсткой схемы. Она удобна для гибких и вложенных данных, а для связанных финансовых и учётных данных обычно надёжнее реляционная база.

Коротко о MongoDB

MongoDB — популярная документная база данных. Вместо таблиц со строками она хранит документы — объекты, похожие на JSON, с вложенными полями и массивами. Это одна из самых известных NoSQL-систем.

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

Документы, коллекции и BSON

Аналогия с реляционной базой:

Реляционная базаMongoDB
База данныхБаза данных
ТаблицаКоллекция
СтрокаДокумент
СтолбецПоле
Первичный ключПоле _id

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

{
  "_id": "665f1c2a9b1e8a3f4c2d1a10",
  "name": "Рюкзак городской",
  "price": 350000,
  "tags": ["сумки", "город"],
  "specs": { "volume": 20, "color": "чёрный" }
}
  • Коллекция — группа документов, например products. Документы в ней не обязаны иметь одинаковый набор полей.
  • _id — уникальный идентификатор. Если его не указать, MongoDB создаст его сама (тип ObjectId).
  • BSON (Binary JSON) — двоичный формат, в котором MongoDB хранит документы на диске. Он быстрее разбирается, чем текстовый JSON, и поддерживает дополнительные типы: даты, ObjectId, точные десятичные числа Decimal128, двоичные данные.

Базовые CRUD-операции

Примеры для оболочки mongosh. В драйверах для Node.js, Python и других языков методы называются так же или очень похоже.

// Create — добавить документ
db.products.insertOne({ name: "Термокружка", price: 120000, tags: ["посуда"] })

// Read — найти документы
db.products.find({ price: { $lt: 200000 } })
db.products.findOne({ name: "Термокружка" })

// Update — изменить поле
db.products.updateOne(
  { name: "Термокружка" },
  { $set: { price: 110000 } }
)

// Delete — удалить документ
db.products.deleteOne({ name: "Термокружка" })

Обратите внимание: условия запросов тоже записываются документами. $lt означает «меньше», $set — «установить значение поля». Не путайте updateOne, который меняет отдельные поля через операторы вроде $set, и replaceOne, который заменяет документ целиком, — это частая ошибка новичков.

Индексы в MongoDB так же важны, как в SQL: db.products.createIndex({ price: 1 }) ускорит поиск по цене.

Когда MongoDB подходит хорошо

  • Разнородные данные. Каталог, где у одежды, техники и мебели совершенно разные характеристики.
  • Вложенные структуры, которые читаются целиком: профиль пользователя с настройками, статья с блоками контента.
  • Быстрое прототипирование, когда структура данных ещё меняется.
  • События, логи, данные с устройств, где записей много, а связей мало.
  • Горизонтальное масштабирование через шардинг, если объёмы действительно большие.

Когда надёжнее реляционная база

  • Много связей между сущностями. Клиенты, заказы, товары, склады, оплаты постоянно ссылаются друг на друга. В MongoDB есть $lookup для объединения коллекций, но SQL с JOIN здесь естественнее.
  • Деньги и учёт. MongoDB поддерживает многодокументные транзакции, но в реляционных базах транзакции и ограничения целостности — основа модели, и с ними меньше подводных камней.
  • Сложная отчётность с группировками по многим таблицам.
  • Строгие правила данных. В MongoDB можно включить валидацию схемы, но по умолчанию база примет почти любой документ.

Частые ошибки

  • Считать, что схема не нужна. Она всё равно есть — просто теперь её поддерживает код. Включайте валидацию.
  • Копировать реляционную модель: десятки коллекций и постоянные $lookup.
  • Бесконечно растущие массивы внутри документа, например все комментарии к посту. У документа есть ограничение размера, поэтому такие данные лучше выносить в отдельную коллекцию.
  • Забывать про индексы и бэкапы.

Частые вопросы

Есть бесплатная Community-версия для самостоятельной установки, а также облачный сервис MongoDB Atlas с бесплатным начальным уровнем и платными тарифами. Условия лицензии и тарифов лучше проверять в официальной документации.

Поможем с этим

Если хотите не разбираться самим, а получить результат — этим мы занимаемся каждый день.

Обсудить проект

Читайте также

Есть идея или задача? Расскажите нам

Ответим в течение рабочего дня и предложим решение. Консультация бесплатная.