eBay держит каталог товаров в MongoDB: это сценарий с тяжёлым чтением, где реплика-сет каталога вырос до 50 узлов. У товара в items массив вариантов variants (цвет, объём памяти), у варианта — остаток qty.
Для дашборда склада посчитайте суммарный остаток stock по каждой категории category. Категории, где у товаров нет вариантов (массив пуст или поля нет), тоже нужны — с нулём.
Порядок: по убыванию stock, при равенстве — по category.
В работе: Остатки по складам, суммы по позициям заказов, всё, где числа лежат во вложенном массиве.
MongoDB · MongoDB 8.0.20
Коллекции
items — товар каталога
| Поле | Тип | Что значит |
|---|---|---|
item_id | int | id товара |
category | string | категория |
title | string | название |
variants | array<object> / нет поля | sku, qty — остаток варианта |
Пример: документы
items
[
{
"title": "Pixel 9",
"item_id": 1,
"category": "Cell Phones",
"variants": [
{
"qty": 4,
"sku": "P9-128-BLK"
},
{
"qty": 1,
"sku": "P9-256-BLU"
}
]
},
{
"title": "Seiko 5",
"item_id": 2,
"category": "Watches",
"variants": [
{
"qty": 2,
"sku": "S5-STEEL"
}
]
},
{
"title": "iPhone 16",
"item_id": 3,
"category": "Cell Phones",
"variants": [
{
"qty": 3,
"sku": "I16-128"
}
]
},
{
"title": "Air Max 90",
"item_id": 4,
"category": "Sneakers",
"variants": []
}
]
Ожидаемый ответ
[
{
"stock": 8,
"category": "Cell Phones"
},
{
"stock": 2,
"category": "Watches"
},
{
"stock": 0,
"category": "Sneakers"
}
]
db.коллекция.aggregate([...]). Выполняем его в браузере движком агрегаций на 4 наборах документов: пример выше и скрытые — с пропущенными полями, null и пустыми коллекциями. Порядок документов важен, порядок полей внутри документа — нет. $out и $merge запрещены.
{"collection": "items", "pipeline": [ … ]}
Источник: кейс eBay: каталог товаров на MongoDB, MongoDB World 2017. Условие пересказано своими словами.
Посмотреть данные, проверить часть pipeline. На зачёт не влияет.
Здесь появится результат отправки.