MongoDB
Что это
MongoDB — это документоориентированная база данных, которая хранит данные в виде гибких, похожих на JSON документов (BSON), сгруппированных в коллекции. Вместо жёстких таблиц и строк каждый документ может иметь собственную форму, что позволяет быстро развивать модель данных. Это популярный выбор для приложений, чьи данные естественно ложатся во вложенные объекты.
Сильные стороны
- Гибкая схема: документы могут различаться и развиваться без миграций.
- Данные напрямую соответствуют объектам приложения, сокращая код преобразования.
- Богатый язык запросов плюс мощный конвейер агрегации.
- Горизонтальное масштабирование за счёт встроенного шардинга.
- Сильная поддержка вложенных полей и массивов.
Компромиссы
- Легко создать несогласованные данные без дисциплинированного проектирования схемы.
- Транзакции по нескольким документам существуют, но они тяжелее, чем в реляционных хранилищах.
- Соединения (
$lookup) ограничены по сравнению с SQL; данные часто денормализуют. - Денормализация может дублировать данные и усложнять обновления.
Когда использовать
Выбирайте 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 } } }
]);