Средний ~25 мин чтения

MongoDB: документные базы данных

Урок 2 из 5 в курсе NoSQL базы данных

MongoDB: документные базы данных

MongoDB хранит данные как JSON-документы в коллекциях; схема гибкая; сила — вложенные документы и горизонтальное масштабирование

Почему это важно: MongoDB — самая популярная документная БД; понимание её модели данных, aggregation pipeline и индексов критично для эффективного использования

Главная идея

вместо таблиц и строк — коллекции и документы. Вложенные объекты и массивы хранятся в одном документе без JOIN

Как это выглядит на практике

  1. db.users.insertOne({name: 'Alice', email: 'alice@example.com', address: {city: 'Moscow'}}) — документ с вложенным объектом.
  2. db.users.find({'address.city': 'Moscow'}) — запрос по вложенному полю.
  3. db.posts.aggregate([{$match: {published: true}}, {$group: {_id: '$author', count: {$sum: 1}}}]) — aggregation pipeline.
  4. db.users.createIndex({email: 1}, {unique: true}) — уникальный индекс.
  5. Replica set: primary + secondary nodes; автоматический failover при падении primary.

Что происходит под капотом

  • BSON (Binary JSON): внутренний формат хранения; поддерживает больше типов чем JSON (Date, ObjectId, Decimal128).
  • ObjectId: 12-байтный идентификатор; содержит timestamp, machine id, process id, counter.
  • WiredTiger storage engine: MVCC (multi-version concurrency control), document-level locking.
  • Aggregation pipeline: серия стадий ($match, $group, $sort, $lookup, $project); эффективнее чем map-reduce.
  • Sharding key выбор: равномерное распределение данных; плохой ключ создаёт hotspots.

Типичные ошибки и заблуждения

  • Ошибка: MongoDB не поддерживает транзакции. С версии 4.0 поддерживает multi-document ACID транзакции.
  • Ошибка: вложенные документы всегда лучше ссылок. Если вложенный документ нужен независимо — лучше ссылка и $lookup.
  • Ошибка: MongoDB не нужны индексы — она быстрая. Без индекса db.collection.find() делает full collection scan.
  • Ошибка: flexible schema означает 'думать о схеме не нужно'. Неконтролируемая схема ведёт к несовместимым документам в одной коллекции.

Ключевые выводы

  • Aggregation pipeline — основной инструмент для аналитических запросов.
  • Индексы обязательны: без них полный скан коллекции.
  • Вложенные документы хороши для данных, которые не нужны отдельно.
  • Multi-document транзакции доступны с MongoDB 4.0.

Термины урока

Collection: аналог таблицы; хранит документы.
Document: BSON-объект; аналог строки с гибкой структурой.
Aggregation pipeline: цепочка операций преобразования документов.
$lookup: операция JOIN в aggregation pipeline.
Replica set: группа MongoDB узлов для репликации и HA.
Shard: горизонтальный раздел данных на отдельном узле.

Связь с работой backend-разработчика

explain() — лучший друг при оптимизации. db.collection.find({...}).explain('executionStats') показывает, используется ли индекс. Цель: IXSCAN вместо COLLSCAN.

Мини-разбор реальной ситуации

Приложение логирует события пользователей в MongoDB: 50M документов. Запросы к events по user_id и timestamp занимают 30 секунд. explain() показывает COLLSCAN. Составной индекс {user_id: 1, timestamp: -1} сокращает время до 50 миллисекунд.

Что запомнить

  • explain() показывает план запроса; COLLSCAN — сигнал нужен индекс.
  • Aggregation pipeline — для сложных запросов.
  • Схема MongoDB требует дизайна, как и реляционная.

Итог

MongoDB мощна для правильных задач: гибкая схема, иерархические данные, горизонтальное масштабирование. Изучи aggregation pipeline и индексы — это 80% эффективной работы с MongoDB.