MongoDB
| Тип | документоориентированная NoSQL-СУБД |
|---|---|
| Разработчик | MongoDB, Inc. (ранее 10gen) |
| Первый выпуск | 2009 |
| Формат данных | BSON (двоичный JSON) |
| Язык запросов | MQL, агрегационный конвейер |
| Масштабирование | наборы реплик, встроенное шардирование |
| Лицензия | SSPL (с октября 2018), ранее AGPL |
| Порт по умолчанию | 27017 |
MongoDB — документоориентированная NoSQL-СУБД, самая популярная в своём классе. Вместо таблиц и строк она хранит коллекции документов — JSON-подобных объектов с вложенными полями и массивами, записанных в двоичном формате BSON. Схема документов не задаётся заранее, что упрощает быстрые изменения модели данных, а репликация и шардирование встроены в СУБД.[1]
История
MongoDB создали в 2007 году основатели DoubleClick — Дуайт Мерримен, Элиот Хоровиц и Кевин Райан — в компании 10gen как часть облачной платформы; в 2009 году СУБД выпустили отдельно с открытым кодом. Название — от английского humongous («огромный»). Ранние версии критиковали за потерю данных при настройках по умолчанию и глобальную блокировку записи; с переходом на движок хранения WiredTiger (3.0, 2015), появлением многодокументных транзакций (4.0, 2018) и усилением гарантий записи по умолчанию СУБД стала гораздо надёжнее. В 2018 году лицензия сменилась на SSPL, которую не признали открытой OSI и дистрибутивы Linux;[5] это открыло путь совместимым альтернативам вроде FerretDB (поверх PostgreSQL). Облачный сервис компании — MongoDB Atlas.
Модель данных
{
"_id": ObjectId("6731f0c2e1a4b3d2c1a0f9e8"),
"name": "Иван",
"email": "ivan@example.com",
"tags": ["admin", "beta"],
"address": { "city": "Москва", "zip": "101000" },
"orders": [
{ "sku": "A-17", "qty": 2, "price": 990 },
{ "sku": "B-03", "qty": 1, "price": 4500 }
]
}
BSON расширяет JSON типами дат, двоичных данных, ObjectId, 64-битных целых и Decimal128.[6] Максимальный размер документа — 16 МБ.
Главный принцип моделирования — данные, которые читаются вместе, хранятся вместе.[2] Связи «один к немногим» обычно встраивают в документ (адрес, позиции заказа), а «один ко многим» с неограниченным ростом или «многие ко многим» — хранят отдельно со ссылками по _id. Это противоположно нормализации в реляционных БД: дублирование данных допустимо ради быстрого чтения одним запросом.
Гибкая схема не означает отсутствие схемы: со временем документы разных форм усложняют код. MongoDB поддерживает валидацию по JSON Schema на уровне коллекции, а ORM-подобные библиотеки (Mongoose, Beanie, ODM на Pydantic) задают схему в коде приложения.
Запросы
Работа ведётся через оболочку mongosh или драйверы (PyMongo, Motor, официальные драйверы для Go, Node.js, Java):
db.users.insertOne({ name: "Анна", tags: ["beta"], age: 28 })
db.users.find({ age: { $gte: 18 }, tags: "beta" }, { name: 1 }).sort({ age: -1 }).limit(10)
db.users.updateOne({ name: "Анна" }, { $push: { tags: "admin" }, $inc: { logins: 1 } })
db.users.createIndex({ email: 1 }, { unique: true })
Для аналитики служит агрегационный конвейер — последовательность стадий, похожая на конвейеры Unix:[3]
db.orders.aggregate([
{ $match: { status: "paid", createdAt: { $gte: ISODate("2026-10-01") } } },
{ $unwind: "$items" },
{ $group: { _id: "$items.sku", revenue: { $sum: { $multiply: ["$items.qty", "$items.price"] } } } },
{ $sort: { revenue: -1 } },
{ $limit: 5 }
])
Есть стадия $lookup — аналог LEFT JOIN, а также полнотекстовый и векторный поиск (в Atlas и с версии 8.x в самостоятельных установках) для задач RAG.
Индексы строятся на B-деревьях и бывают составными, по элементам массивов (multikey), уникальными, частичными, TTL (автоматическое удаление старых документов), геопространственными. Запрос без подходящего индекса сканирует всю коллекцию — план проверяют через .explain().
Надёжность и масштабирование
- Набор реплик (replica set) — один первичный узел и несколько вторичных; при отказе первичного узлы автоматически выбирают нового за секунды (см. Репликация баз данных).
- Гарантии записи и чтения настраиваются:
writeConcern: "majority"(по умолчанию с 5.0) подтверждает запись после попадания на большинство узлов. - Транзакции — операции над одним документом атомарны всегда; многодокументные ACID-транзакции есть с версии 4.0, но дороже и не рекомендуются как основной инструмент.[4]
- Шардирование встроено: коллекция делится по ключу шардирования на чанки, маршрутизатор
mongosнаправляет запросы, балансировщик переносит чанки между шардами (см. Шардирование).
Безопасность
Старые версии по умолчанию слушали все интерфейсы без аутентификации, и тысячи открытых баз были украдены или зашифрованы вымогателями. Сейчас MongoDB по умолчанию слушает только localhost, но чек-лист остаётся обязательным: включить аутентификацию и ролевой доступ, TLS, файрвол, не выставлять порт 27017 в интернет.[7] В запросах важно не подставлять пользовательские объекты напрямую — иначе возможны NoSQL-инъекции с операторами $ne, $where (ср. SQL-инъекция (как защищаться)).
Когда выбирать
MongoDB удобна для данных с естественной иерархической структурой (каталоги товаров с разными атрибутами, профили, контент, события), быстро меняющихся моделей и прототипов, горизонтального масштабирования записи. Реляционная СУБД лучше для данных с множеством связей, сложных отчётов с соединениями и строгой целостности. Стоит учитывать, что PostgreSQL с типом jsonb закрывает многие сценарии «документов» без отдельной СУБД.