Что такое MongoDB и когда её стоит использовать
Основы3 минРедакция Innovialabs
Коротко
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. - Бесконечно растущие массивы внутри документа, например все комментарии к посту. У документа есть ограничение размера, поэтому такие данные лучше выносить в отдельную коллекцию.
- Забывать про индексы и бэкапы.