Для чего используется MongoDB
Что проверяют
Знаете ли вы, в каких задачах документная модель действительно выигрывает, а где лучше взять PostgreSQL. Ответ «для больших данных и когда нет схемы» сразу вызывает уточнение: как вы проектируете документы и что делаете с согласованностью.
Как отвечать
MongoDB хранит документы в BSON, это JSON-подобный формат с дополнительными типами вроде дат и ObjectId. Один документ ограничен 16 МБ. Сильные стороны:
- гибкие документы: сущности с разным набором полей, например каталог товаров, где у телефона и дивана разные характеристики, а также профили, контент, события;
- модель под запросы: связанные данные вкладываются в один документ, и типичный экран читается одним запросом без
JOIN; - репликация: replica set с автоматическим переключением на новый primary при падении;
- шардирование: горизонтальное масштабирование по shard key, но неудачный ключ потом дорого менять;
- aggregation pipeline:
$match,$group,$lookupдля выборок и отчётов; - индексы: составные, TTL для автоудаления, текстовые, геопространственные
2dsphere.
Стоит сразу убрать мифы. Транзакции на несколько документов есть с версии 4.0, для шардированных кластеров с 4.2. Схему можно проверять на стороне базы через $jsonSchema. С версии 5.0 запись по умолчанию подтверждается большинством реплик (w: "majority").
Со стороны Python: драйвер PyMongo, для асинхронного кода в нём есть AsyncMongoClient, который MongoDB рекомендует вместо Motor. Поверх часто берут ODM: Beanie на Pydantic для FastAPI или MongoEngine.
Где не подходит: сильно связанные данные с отчётами по многим сущностям, учёт денег, строгие инварианты между таблицами. Там PostgreSQL проще, а гибкие поля закрываются колонкой jsonb.
Где спотыкаются
Говорят «схемы нет, проектировать не надо». Схема есть всегда, она просто живёт в коде, и без правил быстро появляются документы трёх разных форматов.
Вкладывают неограниченно растущий массив, например все комментарии внутрь поста. Документ упирается в 16 МБ и всё медленнее обновляется.
Утверждают, что в MongoDB нет транзакций. Это перестало быть правдой ещё в 2018 году.