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

127. Сводка по абонентам одним запросом

Сложная

В subscribers — абоненты региона за октябрь 2026 года: тариф tariff и мобильный трафик traffic_gb. У новых SIM-карт, которые ещё не выходили в сеть, поля traffic_gb нет.

Дашборд продаж просит один документ из трёх полей:

by_tariff — массив {tariff, subs} по убыванию subs, при равенстве по tariff; top3 — три абонента с наибольшим трафиком {sub_id, traffic_gb}, при равенстве — по sub_id; heavy — число абонентов с traffic_gb от 50 ГБ, ноль, если таких нет.

В работе: Дашборды и страницы поиска с фасетами: счётчики по фильтрам и выдача одним запросом.

MongoDB · MongoDB 8.0.20

Коллекции

subscribers — абонент за месяц

ПолеТипЧто значит
sub_idstringid абонента
tariffstringтариф
traffic_gbdouble / нет полямобильный трафик за месяц

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

subscribers

[
 {
  "sub_id": "m01",
  "tariff": "Мой безлимит",
  "traffic_gb": 72.5
 },
 {
  "sub_id": "m02",
  "tariff": "Для своих",
  "traffic_gb": 12
 },
 {
  "sub_id": "m03",
  "tariff": "Мой безлимит",
  "traffic_gb": 50
 },
 {
  "sub_id": "m04",
  "tariff": "Супер",
  "traffic_gb": 3.1
 },
 {
  "sub_id": "m05",
  "tariff": "Мой безлимит",
  "traffic_gb": 120
 },
 {
  "sub_id": "m06",
  "tariff": "Для своих",
  "traffic_gb": 50
 }
]

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

[
 {
  "top3": [
   {
    "sub_id": "m05",
    "traffic_gb": 120
   },
   {
    "sub_id": "m01",
    "traffic_gb": 72.5
   },
   {
    "sub_id": "m03",
    "traffic_gb": 50
   }
  ],
  "heavy": 4,
  "by_tariff": [
   {
    "subs": 3,
    "tariff": "Мой безлимит"
   },
   {
    "subs": 2,
    "tariff": "Для своих"
   },
   {
    "subs": 1,
    "tariff": "Супер"
   }
  ]
 }
]
Как проверяем Запрос — JSON: имя коллекции и стадии aggregate, как в db.коллекция.aggregate([...]). Выполняем его в браузере движком агрегаций на 4 наборах документов: пример выше и скрытые — с пропущенными полями, null и пустыми коллекциями. Порядок документов важен, порядок полей внутри документа — нет. $out и $merge запрещены.
{"collection": "subscribers", "pipeline": [ … ]}
$facet$group$count$sortByCount$ifNullпустой результат

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

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