Войти Регистрация
Data base

124. Остатки каталога по категориям

Средняя

eBay держит каталог товаров в MongoDB: это сценарий с тяжёлым чтением, где реплика-сет каталога вырос до 50 узлов. У товара в items массив вариантов variants (цвет, объём памяти), у варианта — остаток qty.

Для дашборда склада посчитайте суммарный остаток stock по каждой категории category. Категории, где у товаров нет вариантов (массив пуст или поля нет), тоже нужны — с нулём.

Порядок: по убыванию stock, при равенстве — по category.

В работе: Остатки по складам, суммы по позициям заказов, всё, где числа лежат во вложенном массиве.

MongoDB · MongoDB 8.0.20

Коллекции

items — товар каталога

ПолеТипЧто значит
item_idintid товара
categorystringкатегория
titlestringназвание
variantsarray<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"
 }
]
Как проверяем Запрос — JSON: имя коллекции и стадии aggregate, как в db.коллекция.aggregate([...]). Выполняем его в браузере движком агрегаций на 4 наборах документов: пример выше и скрытые — с пропущенными полями, null и пустыми коллекциями. Порядок документов важен, порядок полей внутри документа — нет. $out и $merge запрещены.
{"collection": "items", "pipeline": [ … ]}
$unwindpreserveNullAndEmptyArrays$group$ifNullвложенные массивы

Источник: кейс eBay: каталог товаров на MongoDB, MongoDB World 2017. Условие пересказано своими словами.

Давали на собеседовании? Ответов пока мало — ваш поможет.