MongoDB

Материал из llmdocs — справочник разработчика
Портал: Базы данных
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 закрывает многие сценарии «документов» без отдельной СУБД.

См. также

Источники

  1. MongoDB Manual
  2. MongoDB — Data Modeling
  3. MongoDB — Aggregation Pipeline
  4. MongoDB — Transactions
  5. MongoDB — Server Side Public License FAQ
  6. BSON specification
  7. MongoDB — Security Checklist