MongoDB

Как организовать базу MongoDB с использованием Mongoose

Лучше всего организовывать MongoDB с использованием Mongoose не от коллекций, а от сценариев приложения: какие данные вы будете хранить, как часто читать, что обновлять вместе, где нужны связи и какие запросы будут самыми частыми. После этого описываются схемы Mongoose, модели, индексы и правила валидации

Для небольшого проекта нормальный порядок такой: User, Post, Comment, Order или другие сущности, затем схемы, затем связи через ObjectId или вложенные документы

Сначала определите сущности

Например, для блога:

  • пользователь;
  • статья;
  • комментарий.

Для магазина:

  • товар;
  • пользователь;
  • заказ;
  • платеж;
  • адрес доставки.

Не создавайте коллекции просто потому, что «так принято». В MongoDB часть данных удобно вкладывать внутрь документа, а часть лучше хранить отдельно

Когда вкладывать документ

Вкладывайте данные, если они почти всегда читаются вместе и не растут бесконечно

Пример адреса пользователя:

const userSchema = new mongoose.Schema({
  name: { type: String, required: true },
  email: { type: String, required: true, unique: true },
  address: {
    city: String,
    street: String,
    apartment: String
  }
});

Адрес часто нужен вместе с пользователем, поэтому вложение выглядит естественно

Когда делать ссылку

Ссылку через ObjectId лучше использовать, если данные живут отдельно, могут быть большими или используются в разных местах

Пример статьи и автора:

const postSchema = new mongoose.Schema(
  {
    title: { type: String, required: true },
    body: { type: String, required: true },
    author: {
      type: mongoose.Schema.Types.ObjectId,
      ref: "User",
      required: true
    }
  },
  { timestamps: true }
);

Затем автора можно получить через populate():

const posts = await Post.find().populate("author", "name email");

Добавьте валидацию

Схема должна защищать данные от очевидного мусора:

const productSchema = new mongoose.Schema(
  {
    title: { type: String, required: true, trim: true },
    price: { type: Number, required: true, min: 0 },
    status: {
      type: String,
      enum: ["draft", "active", "archived"],
      default: "draft"
    }
  },
  { timestamps: true }
);

required, min, enum, trim и timestamps уже сильно улучшают качество данных

Индексы ставьте под запросы

Индекс нужен не «на всякий случай», а под конкретный частый запрос. Если вы часто ищете пользователя по email:

userSchema.index({ email: 1 }, { unique: true });

Если часто выводите статьи автора по дате:

postSchema.index({ author: 1, createdAt: -1 });

Лишние индексы замедляют запись и занимают место, поэтому не добавляйте их без сценария

Структура проекта

Для простого Node.js-проекта удобно так:

src/
  db/
    connect.js
  models/
    User.js
    Post.js
    Product.js
  services/
    posts.service.js
  scripts/
    seed.js

Модели отвечают за форму данных. Сервисы отвечают за действия: создать статью, найти товары, обновить заказ. Seed-скрипты отдельно заполняют базу тестовыми данными

Частые ошибки

Все вложили в один огромный документ

Сначала удобно, потом документ становится тяжелым. Большие комментарии, история заказов или события лучше хранить отдельно

Везде сделали ссылки

Если каждую мелочь хранить отдельно, приложение начинает делать слишком много запросов. Иногда вложенный объект проще и быстрее

Не включили timestamps

Без createdAt и updatedAt сложнее сортировать, отлаживать и понимать историю данных

Не проверили реальные запросы

Схема должна соответствовать тому, как приложение читает данные. Если интерфейс всегда показывает карточку товара с ценой, названием и статусом, эти поля должны быть доступны без лишних сложных операций

Короткий чек-лист

  1. Опишите главные сущности проекта.
  2. Решите, что вкладывать, а что связывать через ObjectId.
  3. Добавьте валидацию в схемы.
  4. Добавьте индексы под частые запросы.
  5. Включите timestamps.
  6. Вынесите модели, сервисы и seed-скрипты в отдельные файлы.
  7. Проверьте структуру на реальных сценариях чтения и обновления.

Что почитать дальше по MongoDB

Если нужен общий маршрут по теме, откройте рубрику MongoDB. Для соседних задач пригодятся эти разборы:

Подписаться
Уведомить о
guest
0 комментариев
Старые
Новые Популярные

Настройки cookie

0
Оставьте комментарий! Напишите, что думаете по поводу статьи.x