Введение
В этой лабораторной работе вы изучите основы проектирования структурированной схемы документов для данных о продуктах с использованием 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.

