MongoDB: документные базы данных
MongoDB хранит данные как JSON-документы в коллекциях; схема гибкая; сила — вложенные документы и горизонтальное масштабирование
Почему это важно: MongoDB — самая популярная документная БД; понимание её модели данных, aggregation pipeline и индексов критично для эффективного использования
Главная идея
вместо таблиц и строк — коллекции и документы. Вложенные объекты и массивы хранятся в одном документе без JOIN
Как это выглядит на практике
- db.users.insertOne({name: 'Alice', email: 'alice@example.com', address: {city: 'Moscow'}}) — документ с вложенным объектом.
- db.users.find({'address.city': 'Moscow'}) — запрос по вложенному полю.
- db.posts.aggregate([{$match: {published: true}}, {$group: {_id: '$author', count: {$sum: 1}}}]) — aggregation pipeline.
- db.users.createIndex({email: 1}, {unique: true}) — уникальный индекс.
- 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.
Термины урока
Связь с работой 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.