Для чего используется MongoDB
Что проверяют
Понимаете ли вы, в каких задачах документная модель выигрывает у PostgreSQL, и не повторяете ли мифы десятилетней давности. Следом обычно спрашивают про транзакции, шардирование и работу с драйвером из Go.
Как отвечать
MongoDB это документная база: данные лежат в коллекциях как документы BSON, вложенные объекты и массивы хранятся внутри документа, без раскладки по таблицам. Типичные сценарии:
- данные с разной структурой: каталог товаров с разными атрибутами, профили, контент CMS;
- чтение агрегата целиком: заказ с позициями читается одним запросом по ключу, без
JOIN; - события и логи: TTL-индекс сам удаляет старые документы;
- геоданные: индекс
2dsphereи запросы вроде$near; - горизонтальный рост: шардирование по shard key, отказоустойчивость через replica set с автоматическим выбором нового primary.
Современное состояние назовите точно. Многодокументные ACID-транзакции есть с версии 4.0 для replica set и с 4.2 для шардированных кластеров. Соединения делаются через $lookup в aggregation pipeline. Схему можно ограничить валидатором $jsonSchema. Write concern по умолчанию с версии 5.0 это majority. Лимит на документ 16 МБ.
В Go работают с официальным драйвером go.mongodb.org/mongo-driver (актуальная ветка v2). mongo.Client безопасен для горутин и держит пул соединений, его создают один раз на приложение. Структуры маппятся тегами bson:"field", каждая операция принимает context.Context с таймаутом.
Где спотыкаются
Говорят, что в MongoDB нет транзакций и соединений. Это давно не так; сильный ответ звучит иначе: транзакции есть, но модель данных строят так, чтобы они требовались редко.
Путают гибкую схему с отсутствием проектирования. Схему проектируют под запросы: что вкладывать, что хранить ссылкой. Неограниченно растущий массив внутри документа рано или поздно упрётся в 16 МБ и замедлит обновления.
Передают сортировку как bson.M. Порядок ключей в map в Go не определён, и составная сортировка поедет, нужен bson.D. Рядом частая ошибка: новый клиент на каждый запрос, пул не переиспользуется.