~/VibeHandbook

Базы данных

mongodb.com

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 } } }
]);