MongoDB
Что это
Представьте стопку карточек-указателей, где каждая карточка может нести разные поля, вместо жёсткой таблицы, в которой каждая строка обязана иметь одни и те же столбцы. MongoDB работает как такая стопка карточек. Это документоориентированная база данных, которая хранит данные в виде гибких документов (считайте каждый «документ» одной карточкой), сгруппированных в коллекции. Документы сохраняются в формате BSON — это двоичная форма (нотация объектов JavaScript), распространённого способа записывать данные в виде именованных полей, созданная в MongoDB. Вместо жёстких таблиц и строк каждый документ может иметь собственную форму, что позволяет быстро развивать модель данных. Это популярный выбор для приложений, чьи данные естественно ложатся во вложенные объекты.
Сильные стороны
- Гибкая схема: документы могут различаться и развиваться без миграций.
- Данные напрямую соответствуют объектам приложения, сокращая код преобразования.
- Богатый язык запросов плюс мощный конвейер агрегации.
- Горизонтальное масштабирование за счёт встроенного шардинга.
- Сильная поддержка вложенных полей и массивов.
Компромиссы
- Легко создать несогласованные данные без дисциплинированного проектирования схемы.
- Транзакции по нескольким документам существуют, но они тяжелее, чем в реляционных хранилищах.
- Соединения (
$lookup) ограничены по сравнению с (язык структурированных запросов); данные часто денормализуют. - Денормализация (хранение копий одних и тех же данных в нескольких местах, чтобы избежать лишних обращений) может дублировать данные и усложнять обновления.
Когда использовать
Выбирайте MongoDB для систем управления контентом, каталогов, профилей пользователей, журналирования событий и приложений с развивающимися или иерархическими данными, где документы подходят лучше, чем нормализованные таблицы.
Соответствие вайб-кодингу
Управляя ИИ, не позволяйте «отсутствию схемы» означать «отсутствие плана». Попросите ИИ определить чёткую форму документа и обеспечить её соблюдение с помощью валидации JSON Schema или ODM (объектно-документный преобразователь) вроде Mongoose, включая обязательные поля и типы. Скажите ему, встраивать ли связанные данные или ссылаться на них по id, исходя из паттернов доступа, и добавлять индексы для полей, по которым вы делаете запросы и сортировку. Хороший совет: пусть ИИ использует параметризованные объекты запросов. Это значит, что запросы никогда не нужно собирать, склеивая сырые пользовательские строки. Также пусть он объясняет свой выбор между встраиванием и ссылкой. Тогда вы будете понимать затраты на чтение, запись и обновление.
// Валидация схемы поддерживает согласованность документов
db.createCollection("users", {
validator: {
$jsonSchema: {
bsonType: "object",
required: ["email", "createdAt"],
properties: {
email: { bsonType: "string" },
createdAt: { bsonType: "date" },
roles: { bsonType: "array", items: { bsonType: "string" } }
}
}
}
});
db.users.createIndex({ email: 1 }, { unique: true });
// Агрегация: подсчёт активных пользователей по ролям
db.users.aggregate([
{ $match: { active: true } },
{ $unwind: "$roles" },
{ $group: { _id: "$roles", count: { $sum: 1 } } }
]);