Структурирование данных продуктов в MongoDB

MongoDBBeginner
Практиковаться сейчас

Введение

В этой лабораторной работе вы изучите основы проектирования структурированной схемы документов для данных о продуктах с использованием MongoDB. Для приложения электронной коммерции хорошо спроектированная схема имеет решающее значение для производительности и масштабируемости. Вы начнете с создания простого документа продукта и постепенно улучшите его, встраивая связанную информацию, такую как цены и информация о наличии на складе, а также используя массивы для атрибутов с несколькими значениями. К концу этой лабораторной работы вы получите твердое понимание того, как эффективно моделировать данные о продуктах в базе данных MongoDB.

Создание базового документа продукта

На этом первом этапе вы подключитесь к серверу MongoDB, создадите новую базу данных и вставите свой первый документ продукта. Это заложит основу нашего каталога продуктов.

Сначала откройте MongoDB Shell (mongosh), чтобы взаимодействовать с базой данных из вашего терминала.

mongosh

Вы увидите приглашение, похожее на test>, указывающее, что вы подключены к серверу MongoDB. Теперь давайте создадим и переключимся на новую базу данных с именем product_catalog. В MongoDB база данных создается автоматически при первом сохранении в нее данных.

use product_catalog

Вывод switched to db product_catalog подтверждает, что вы теперь работаете в этой новой базе данных.

Далее мы создадим коллекцию с именем products и вставим в нее один документ. Документ в MongoDB — это объект BSON, который представляется как JSON. Мы будем использовать метод insertOne().

db.products.insertOne({
  name: "Wireless Headphones",
  brand: "SoundWave",
  category: "Electronics",
  sku: "SW-HD-001"
});

Эта команда вставляет документ с четырьмя полями: name, brand, category и sku. Вывод покажет подтверждение и уникальный _id, назначенный документу MongoDB.

{
  "acknowledged": true,
  "insertedId": ObjectId("...")
}

Чтобы убедиться, что документ был создан успешно, вы можете использовать метод find(), чтобы получить все документы из коллекции products.

db.products.find();

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

[
  {
    _id: ObjectId('...'),
    name: 'Wireless Headphones',
    brand: 'SoundWave',
    category: 'Electronics',
    sku: 'SW-HD-001'
  }
]

Теперь вы успешно создали свой первый документ продукта. Мы продолжим работать в оболочке mongosh для следующих шагов.

Встраивание информации о цене и наличии

Ключевым преимуществом документной модели MongoDB является возможность встраивать связанную информацию в один документ. На этом этапе вы обновите существующий продукт, добавив вложенные объекты для деталей цены и наличия на складе. Такой подход объединяет все релевантные данные о продукте, что может повысить производительность запросов за счет уменьшения необходимости в отдельных выборках.

Мы будем использовать метод updateOne(), чтобы изменить созданный нами документ. Этот метод принимает два аргумента: фильтр для идентификации обновляемого документа и оператор обновления, который указывает на изменения.

Добавим объект price и объект stock. Мы будем использовать оператор $set для добавления этих новых полей.

db.products.updateOne(
  { sku: "SW-HD-001" },
  {
    $set: {
      price: {
        base: 149.99,
        currency: "USD"
      },
      stock: {
        quantity: 250,
        inStock: true
      }
    }
  }
);

Разберем эту команду:

  • Первый объект { sku: "SW-HD-001" } — это фильтр. Он указывает MongoDB найти документ, где поле sku имеет значение "SW-HD-001".
  • Второй объект { $set: { ... } } — это операция обновления. $set добавляет новые поля или изменяет существующие. Здесь мы добавляем поля price и stock, которые сами по себе являются вложенными документами.

Вывод подтвердит, что один документ был найден и изменен.

{
  "acknowledged": true,
  "insertedId": null,
  "matchedCount": 1,
  "modifiedCount": 1,
  "upsertedCount": 0
}

Теперь давайте снова получим документ, чтобы увидеть изменения.

db.products.find({ sku: "SW-HD-001" });

Вывод теперь показывает продукт с новой встроенной информацией о цене (price) и наличии на складе (stock). Эта структура более организована и интуитивно понятна, чем наличие отдельных таблиц для цены и наличия на складе в реляционной базе данных.

[
  {
    _id: ObjectId('...'),
    name: 'Wireless Headphones',
    brand: 'SoundWave',
    category: 'Electronics',
    sku: 'SW-HD-001',
    price: { base: 149.99, currency: 'USD' },
    stock: { quantity: 250, inStock: true }
  }
]

Использование массивов для атрибутов продукта

Продукты часто имеют атрибуты, которые могут иметь несколько значений, такие как доступные цвета, теги для поиска или список спецификаций. MongoDB элегантно обрабатывает это с помощью массивов. На этом этапе вы добавите массив тегов к вашему документу продукта.

Мы снова будем использовать метод updateOne() с оператором $set для добавления нового поля под названием tags. Это поле будет содержать массив строк.

db.products.updateOne(
  { sku: "SW-HD-001" },
  {
    $set: {
      tags: ["audio", "wireless", "over-ear", "noise-canceling"]
    }
  }
);

Эта команда находит продукт с sku: "SW-HD-001" и добавляет к нему массив tags. Вывод снова подтвердит, что один документ был изменен.

Чтобы увидеть результат, выполните запрос для получения документа еще раз.

db.products.find({ sku: "SW-HD-001" });

Обновленный документ теперь включает массив tags. Хранение этих значений в массиве позволяет легко выполнять запросы для продуктов, имеющих определенный тег.

[
  {
    _id: ObjectId('...'),
    name: 'Wireless Headphones',
    brand: 'SoundWave',
    category: 'Electronics',
    sku: 'SW-HD-001',
    price: { base: 149.99, currency: 'USD' },
    stock: { quantity: 250, inStock: true },
    tags: [ 'audio', 'wireless', 'over-ear', 'noise-canceling' ]
  }
]

Массивы — это мощная функция для моделирования отношений "один ко многим" и хранения списков связанных данных непосредственно в документе.

Добавление и запрос нескольких продуктов

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

Чтобы одновременно добавить несколько документов в коллекцию, вы можете использовать метод insertMany(). Этот метод принимает массив документов в качестве аргумента. Давайте добавим два новых продукта в нашу коллекцию products.

db.products.insertMany([
  {
    name: "Smartwatch",
    brand: "FitTech",
    category: "Electronics",
    sku: "FT-SW-005",
    price: { base: 199.99, currency: "USD" },
    stock: { quantity: 150, inStock: true },
    tags: ["wearable", "fitness", "smartwatch"]
  },
  {
    name: "Classic T-Shirt",
    brand: "UrbanWear",
    category: "Apparel",
    sku: "UW-TS-001",
    price: { base: 24.99, currency: "USD" },
    stock: { quantity: 500, inStock: true },
    tags: ["clothing", "cotton", "casual"]
  }
]);

Вывод подтвердит операцию и перечислит значения _id для двух только что вставленных документов.

Теперь, когда у нас есть несколько продуктов, выполним запрос, чтобы найти только те продукты, которые относятся к категории "Electronics". Вы можете сделать это, передав объект фильтра методу find().

db.products.find({ category: "Electronics" });

Эта команда ищет в коллекции products и возвращает только те документы, где поле category имеет значение "Electronics".

Вывод покажет два электронных продукта в нашем каталоге: "Wireless Headphones" и "Smartwatch".

[
  {
    _id: ObjectId('...'),
    name: 'Wireless Headphones',
    brand: 'SoundWave',
    category: 'Electronics',
    sku: 'SW-HD-001',
    price: { base: 149.99, currency: 'USD' },
    stock: { quantity: 250, inStock: true },
    tags: [ 'audio', 'wireless', 'over-ear', 'noise-canceling' ]
  },
  {
    _id: ObjectId('...'),
    name: 'Smartwatch',
    brand: 'FitTech',
    category: 'Electronics',
    sku: 'FT-SW-005',
    price: { base: 199.99, currency: 'USD' },
    stock: { quantity: 150, inStock: true },
    tags: [ 'wearable', 'fitness', 'smartwatch' ]
  }
]

Теперь вы отработали основные операции по управлению каталогом продуктов. Вы можете выйти из оболочки MongoDB.

exit;

Резюме

В этой лабораторной работе вы изучили основные принципы структурирования данных о продуктах в MongoDB. Вы начали с создания базы данных и вставки базового документа продукта. Затем вы расширили этот документ, встраивая связанные данные, такие как информация о цене и наличии, во вложенные объекты. Вы также узнали, как использовать массивы для обработки атрибутов с несколькими значениями, например, тегов продуктов. Наконец, вы отработали добавление нескольких документов в коллекцию и выполнение базового запроса для фильтрации данных по определенному полю. Эти навыки обеспечивают прочную основу для создания гибких и эффективных моделей данных для приложений электронной коммерции и других систем, использующих MongoDB.