Учебник MongoDB для начинающих
Практический курс по MongoDB — самой популярной документоориентированной NoSQL-базе данных. Если вы уже работали с реляционными БД, здесь вы научитесь думать документами: проектировать данные под запросы, а не под нормализацию. Разберём модель данных, CRUD, моделирование связей, конвейер агрегации, индексы и основы эксплуатации — с корректными примерами запросов в mongosh.
Курс «MongoDB» состоит из 10 разделов и 40 уроков: Введение в MongoDB, CRUD: создание и чтение, CRUD: обновление и удаление, Моделирование данных, Агрегация и индексы, Практика и экосистема, Конвейер агрегации вглубь, Индексы и производительность, Транзакции и согласованность и Репликация, шардирование и эксплуатация. Уроки идут по порядку — от основ к более сложным темам, в каждом есть объяснение с примерами, а в конце — вопросы для самопроверки. К урокам привязаны задачи с автоматической проверкой: прочитали тему — сразу закрепили её кодом.
Программа курса
1 Введение в MongoDB
- Что такое документоориентированная БД
MongoDB и документоориентированная модель: чем NoSQL-документная БД отличается от реляционной и где она уместна.
- Документы, коллекции и базы
Документ, коллекция и база в MongoDB: BSON против JSON и таблица соответствия реляционным понятиям.
- Установка: Atlas, Docker и mongosh
Как поднять MongoDB: облако Atlas, локальный Docker-контейнер и подключение через mongosh.
- Первые команды в mongosh
Первые шаги в mongosh: вставка документа, чтение через find и удаление — базовый цикл работы с коллекцией.
- Что такое документоориентированная БД
2 CRUD: создание и чтение
- Вставка: insertOne и insertMany
Как добавлять документы в MongoDB: insertOne и insertMany, упорядоченная и неупорядоченная вставка.
- Поле _id и тип ObjectId
Зачем нужно поле _id, как устроен ObjectId и можно ли задавать собственный идентификатор документа.
- Чтение и операторы запроса
Чтение документов в MongoDB: фильтры в find и операторы запроса $gt, $lt, $in, $exists, $and, $or.
- Проекции, сортировка и пагинация
Управление выдачей в MongoDB: проекция полей, sort для сортировки и limit/skip для постраничной выборки.
- Вставка: insertOne и insertMany
3 CRUD: обновление и удаление
- Обновление: updateOne и updateMany
Обновление документов в MongoDB: updateOne и updateMany и оператор $set для изменения полей.
- Операторы обновления полей
Операторы обновления MongoDB: $set, $unset, $inc, $mul, $rename и $min/$max для изменения полей.
- Работа с массивами в документах
Изменение массивов в MongoDB: $push, $pull, $addToSet, $each и оператор позиции для элементов массива.
- upsert, replaceOne и удаление
upsert «обнови или вставь», полная замена replaceOne и удаление документов через deleteOne и deleteMany.
- Обновление: updateOne и updateMany
4 Моделирование данных
- Встраивание против ссылок
Embedding и referencing в MongoDB: когда вкладывать связанные данные в документ, а когда хранить ссылки.
- Связи: один-ко-многим и многие-ко-многим
Моделирование связей в MongoDB: один-ко-многим через встраивание или массив ссылок и многие-ко-многим.
- Денормализация и дублирование
Денормализация в MongoDB: когда осознанное дублирование данных ускоряет чтение и как с ним жить.
- Схема, валидация и антипаттерны
Схема в «бессхемной» MongoDB: соглашения о структуре, JSON Schema-валидация и типичные антипаттерны.
- Встраивание против ссылок
5 Агрегация и индексы
- Конвейер агрегации: $match, $group, $sort
Конвейер агрегации MongoDB: этапы $match, $group и $sort для фильтрации, группировки и сортировки данных.
- Аккумуляторы, $project и $lookup
Аккумуляторы $sum/$avg/$min/$max, преобразование полей через $project и объединение коллекций через $lookup.
- Индексы: зачем и какие бывают
Индексы в MongoDB: createIndex, составные и уникальные индексы и почему без них запросы тормозят.
- explain: как понять, что делает запрос
Анализ запросов в MongoDB через explain: как увидеть, использует ли запрос индекс или сканирует коллекцию.
- Конвейер агрегации: $match, $group, $sort
6 Практика и экосистема
- MongoDB из приложения: драйвер Node.js
Работа с MongoDB из приложения на Node.js: подключение драйвером, базовые операции и async/await.
- Транзакции, репликация и шардирование
Транзакции для многодокументных операций, репликация для надёжности и шардирование для масштабирования в MongoDB.
- Проектируем схему: блог и магазин
Практика проектирования схемы MongoDB: модель данных для блога и интернет-магазина с встраиванием и ссылками.
- Итоги и что дальше
Краткое повторение ключевых идей MongoDB и ориентиры для дальнейшего изучения: Atlas, агрегации, производительность.
- MongoDB из приложения: драйвер Node.js
7 Конвейер агрегации вглубь
- Этапы конвейера: $match, $group, $project, $sort
Этапы aggregation pipeline в MongoDB: $match, $group с аккумуляторами $sum/$avg/$push, $project и $addFields, $sort и зачем ранний $match.
- Соединения: $lookup и $unwind
Соединения в MongoDB: $lookup как левый JOIN по localField/foreignField, $unwind для массивов, pipeline-форма $lookup и когда денормализация выгоднее.
- $facet, $bucket, $graphLookup
Продвинутые этапы агрегации MongoDB: подитоги одним проходом через $facet, гистограммы $bucket/$bucketAuto, иерархии $graphLookup и материализация $merge/$out.
- Производительность агрегаций
Как ускорить агрегации MongoDB: ранний $match и $sort до $group, использование индексов на первых этапах, чтение плана через explain, лимит памяти 100 МБ и allowDiskUse, ранний $project.
- Этапы конвейера: $match, $group, $project, $sort
8 Индексы и производительность
- Типы индексов: составные, multikey, текстовые, геопространственные
Все типы индексов MongoDB: одиночные и составные, multikey по массивам, текстовый поиск, 2dsphere для гео, а также уникальные и частичные индексы.
- Правило ESR и порядок полей в составном индексе
Правило ESR (Equality, Sort, Range) для порядка полей в составном индексе MongoDB. Почему порядок важен, что такое префикс и как заменить много индексов одним.
- explain() и покрывающие запросы
Как читать explain() executionStats в MongoDB: IXSCAN против COLLSCAN, метрики totalKeysExamined и totalDocsExamined, покрывающие запросы из индекса.
- Грабли производительности
Антипаттерны производительности MongoDB: лимит документа 16 МБ, неограниченный рост массивов, сортировка без индекса, regex без префикса, $where и плохая схема.
- Типы индексов: составные, multikey, текстовые, геопространственные
9 Транзакции и согласованность
- Атомарность на уровне документа
Почему любая операция над одним документом в MongoDB атомарна, как встраивание убирает нужду в транзакциях и почему $inc и $push безопасны при конкуренции.
- Многодокументные транзакции
Многодокументные транзакции в MongoDB: session.startTransaction/commit/abort, когда они реально нужны, чего стоят и почему обязательны ретраи при TransientTransactionError.
- Read concern и Write concern
Read concern и write concern в MongoDB: w:1 против majority, journal, уровни local/majority/linearizable и компромисс между скоростью записи и надёжностью данных.
- Модели согласованности и retryable writes
Причинная согласованность, read-your-writes, retryable writes и reads в MongoDB, чтение со вторичных узлов и риск устаревания данных при масштабировании чтения.
- Атомарность на уровне документа
10 Репликация, шардирование и эксплуатация
- Replica Set: отказоустойчивость
Replica set в MongoDB: роли primary, secondary и arbiter, выборы primary и автоматический failover, oplog, write concern и чтение со вторичных узлов.
- Шардирование: горизонтальное масштабирование
Шардирование MongoDB: зачем оно нужно, выбор shard key как важнейшее решение, chunks и balancer, hashed против ranged, частые ошибки выбора ключа.
- Change Streams и реактивность
Change Streams в MongoDB: отслеживание изменений в реальном времени через watch(), уведомления и синхронизация, resume token и устойчивость к разрывам.
- Эксплуатация: бэкапы, валидация схемы, Atlas
Эксплуатация MongoDB: mongodump и mongorestore, валидация коллекции через $jsonSchema, мониторинг, облако MongoDB Atlas и базовая безопасность с RBAC.
- Replica Set: отказоустойчивость