# MongoDB

> Документоориентированная NoSQL-СУБД, хранящая данные как JSON-подобные документы BSON; гибкая схема, агрегационный конвейер, репликация через наборы реплик и встроенное шардирование.

Источник: https://llmdocs.ru/wiki/mongodb/ · обновлено 2026-11-09 · лицензия CC BY-SA 4.0

- **Тип**: документоориентированная NoSQL-СУБД
- **Разработчик**: MongoDB, Inc. (ранее 10gen)
- **Первый выпуск**: 2009
- **Формат данных**: BSON (двоичный JSON)
- **Язык запросов**: MQL, агрегационный конвейер
- **Масштабирование**: наборы реплик, встроенное шардирование
- **Лицензия**: SSPL (с октября 2018), ранее AGPL
- **Порт по умолчанию**: 27017
**MongoDB** — документоориентированная [NoSQL](https://llmdocs.ru/wiki/nosql.md)-СУБД, самая популярная в своём классе. Вместо таблиц и строк она хранит **коллекции документов** — JSON-подобных объектов с вложенными полями и массивами, записанных в двоичном формате BSON. Схема документов не задаётся заранее, что упрощает быстрые изменения модели данных, а репликация и шардирование встроены в СУБД.[1]

## История

MongoDB создали в 2007 году основатели DoubleClick — Дуайт Мерримен, Элиот Хоровиц и Кевин Райан — в компании 10gen как часть облачной платформы; в 2009 году СУБД выпустили отдельно с открытым кодом. Название — от английского *humongous* («огромный»). Ранние версии критиковали за потерю данных при настройках по умолчанию и глобальную блокировку записи; с переходом на движок хранения **WiredTiger** (3.0, 2015), появлением многодокументных транзакций (4.0, 2018) и усилением гарантий записи по умолчанию СУБД стала гораздо надёжнее. В 2018 году лицензия сменилась на SSPL, которую не признали открытой OSI и дистрибутивы Linux;[5] это открыло путь совместимым альтернативам вроде FerretDB (поверх [PostgreSQL](https://llmdocs.ru/wiki/postgresql.md)). Облачный сервис компании — MongoDB Atlas.

## Модель данных

```json
{
  "_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`. Это противоположно [нормализации](https://llmdocs.ru/wiki/normalization.md) в реляционных БД: дублирование данных допустимо ради быстрого чтения одним запросом.

Гибкая схема не означает отсутствие схемы: со временем документы разных форм усложняют код. MongoDB поддерживает **валидацию по JSON Schema** на уровне коллекции, а [ORM](https://llmdocs.ru/wiki/orm.md)-подобные библиотеки (Mongoose, Beanie, ODM на Pydantic) задают схему в коде приложения.

## Запросы

Работа ведётся через оболочку `mongosh` или драйверы (PyMongo, Motor, официальные драйверы для Go, Node.js, Java):

```javascript
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]

```javascript
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](https://llmdocs.ru/wiki/rag.md).

[Индексы](https://llmdocs.ru/wiki/database-index.md) строятся на [B-деревьях](https://llmdocs.ru/wiki/b-tree.md) и бывают составными, по элементам массивов (multikey), уникальными, частичными, TTL (автоматическое удаление старых документов), геопространственными. Запрос без подходящего индекса сканирует всю коллекцию — план проверяют через `.explain()`.

## Надёжность и масштабирование

- **Набор реплик** (replica set) — один первичный узел и несколько вторичных; при отказе первичного узлы автоматически выбирают нового за секунды (см. [Репликация баз данных](https://llmdocs.ru/wiki/replication.md)).
- **Гарантии записи и чтения** настраиваются: `writeConcern: "majority"` (по умолчанию с 5.0) подтверждает запись после попадания на большинство узлов.
- **Транзакции** — операции над одним документом атомарны всегда; многодокументные ACID-транзакции есть с версии 4.0, но дороже и не рекомендуются как основной инструмент.[4]
- **Шардирование** встроено: коллекция делится по ключу шардирования на чанки, маршрутизатор `mongos` направляет запросы, балансировщик переносит чанки между шардами (см. [Шардирование](https://llmdocs.ru/wiki/sharding.md)).

## Безопасность

Старые версии по умолчанию слушали все интерфейсы без аутентификации, и тысячи открытых баз были украдены или зашифрованы вымогателями. Сейчас MongoDB по умолчанию слушает только `localhost`, но чек-лист остаётся обязательным: включить аутентификацию и ролевой доступ, TLS, [файрвол](https://llmdocs.ru/wiki/firewall.md), не выставлять порт 27017 в интернет.[7] В запросах важно не подставлять пользовательские объекты напрямую — иначе возможны NoSQL-инъекции с операторами `$ne`, `$where` (ср. [SQL-инъекция (как защищаться)](https://llmdocs.ru/wiki/sql-injection.md)).

## Когда выбирать

MongoDB удобна для данных с естественной иерархической структурой (каталоги товаров с разными атрибутами, профили, контент, события), быстро меняющихся моделей и прототипов, горизонтального масштабирования записи. Реляционная СУБД лучше для данных с множеством связей, сложных отчётов с соединениями и строгой целостности. Стоит учитывать, что PostgreSQL с типом `jsonb` закрывает многие сценарии «документов» без отдельной СУБД.

## См. также

- [NoSQL](https://llmdocs.ru/wiki/nosql.md)
- [PostgreSQL](https://llmdocs.ru/wiki/postgresql.md)
- [Redis](https://llmdocs.ru/wiki/redis.md)
- [JSON](https://llmdocs.ru/wiki/json.md)

## Источники

1. [MongoDB Manual](https://www.mongodb.com/docs/manual/)
2. [MongoDB — Data Modeling](https://www.mongodb.com/docs/manual/data-modeling/)
3. [MongoDB — Aggregation Pipeline](https://www.mongodb.com/docs/manual/core/aggregation-pipeline/)
4. [MongoDB — Transactions](https://www.mongodb.com/docs/manual/core/transactions/)
5. [MongoDB — Server Side Public License FAQ](https://www.mongodb.com/legal/licensing/server-side-public-license/faq)
6. [BSON specification](https://bsonspec.org/)
7. [MongoDB — Security Checklist](https://www.mongodb.com/docs/manual/administration/security-checklist/)
