Добавление массива позиций заказа
Заказ обычно состоит из одного или нескольких продуктов. Лучший способ смоделировать это отношение "один ко многим" в одном документе заказа — использовать массив вложенных документов. Каждый элемент массива будет представлять позицию в заказе.
Давайте обновим наш документ заказа, чтобы включить список позиций. Мы добавим поле items, которое будет массивом. Каждый объект в массиве будет содержать сведения о продукте, такие как его идентификатор, название, цена и количество.
Выполните следующую команду updateOne:
db.orders.updateOne(
{ order_id: "ORD001" },
{
$set: {
items: [
{
product_id: "PROD01",
name: "Laptop",
price: 1200.0,
quantity: 1
},
{
product_id: "PROD02",
name: "Mouse",
price: 25.0,
quantity: 1
}
],
total: 1225.0
}
}
);
Здесь мы снова используем $set для добавления массива items. Мы также обновляем поле total, чтобы оно соответствовало сумме цен позиций. Хранение рассчитанной суммы непосредственно в документе является еще одной оптимизацией производительности, поскольку это избавляет от необходимости агрегации при каждом чтении.
Давайте снова проверим документ, чтобы увидеть новый массив items.
db.orders.findOne({ order_id: "ORD001" });
Вы увидите массив items, встроенный в документ заказа. Такая структура позволяет получать полный заказ, включая все его позиции, с помощью одного запроса к базе данных.