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

130. Траты на такси из помесячных бакетов

Средняя

Операции по карте хранятся в tx_buckets шаблоном bucket: документ на клиента и месяц с массивом txs, не больше 200 операций в документе. Если операций больше, открывается следующий документ того же месяца с seq на единицу больше.

Для кешбэка «Такси 5 %» посчитайте по каждому клиенту за март 2026 года сумму операций категории «Такси» (taxi_rub, возвраты с минусом уменьшают сумму) и их число (taxi_count). Клиенты без операций такси в марте не нужны.

Порядок: по убыванию taxi_rub, затем по client_id.

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

MongoDB · MongoDB 8.0.20

Коллекции

tx_buckets — операции клиента за месяц, часть месяца

ПолеТипЧто значит
client_idintклиент
monthstringГГГГ-ММ
seqintномер документа в месяце
txsarray<object>at, amount_rub, category

Пример: документы

tx_buckets

[
 {
  "seq": 1,
  "txs": [
   {
    "at": "2026-03-02T08:10:00Z",
    "category": "Такси",
    "amount_rub": 420
   },
   {
    "at": "2026-03-02T19:00:00Z",
    "category": "Супермаркеты",
    "amount_rub": 2310
   },
   {
    "at": "2026-03-05T22:40:00Z",
    "category": "Такси",
    "amount_rub": 380
   }
  ],
  "month": "2026-03",
  "client_id": 7001
 },
 {
  "seq": 2,
  "txs": [
   {
    "at": "2026-03-28T07:55:00Z",
    "category": "Такси",
    "amount_rub": 650
   }
  ],
  "month": "2026-03",
  "client_id": 7001
 },
 {
  "seq": 1,
  "txs": [
   {
    "at": "2026-03-10T13:00:00Z",
    "category": "Кафе",
    "amount_rub": 900
   },
   {
    "at": "2026-03-10T15:30:00Z",
    "category": "Такси",
    "amount_rub": 1200
   }
  ],
  "month": "2026-03",
  "client_id": 7002
 },
 {
  "seq": 1,
  "txs": [
   {
    "at": "2026-03-11T09:00:00Z",
    "category": "Супермаркеты",
    "amount_rub": 500
   }
  ],
  "month": "2026-03",
  "client_id": 7003
 }
]

Ожидаемый ответ

[
 {
  "taxi_rub": 1450,
  "client_id": 7001,
  "taxi_count": 3
 },
 {
  "taxi_rub": 1200,
  "client_id": 7002,
  "taxi_count": 1
 }
]
Как проверяем Запрос — JSON: имя коллекции и стадии aggregate, как в db.коллекция.aggregate([...]). Выполняем его в браузере движком агрегаций на 5 наборах документов: пример выше и скрытые — с пропущенными полями, null и пустыми коллекциями. Порядок документов важен, порядок полей внутри документа — нет. $out и $merge запрещены.
{"collection": "tx_buckets", "pipeline": [ … ]}
$unwind$match после $unwind$filterшаблон bucketвложенные массивы

Источник: на данных банка: операции клиента в помесячных документах. Условие пересказано своими словами.

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