В 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_id | string | id абонента |
tariff | string | тариф |
traffic_gb | double / нет поля | мобильный трафик за месяц |
Пример: документы
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": "Супер"
}
]
}
]
db.коллекция.aggregate([...]). Выполняем его в браузере движком агрегаций на 4 наборах документов: пример выше и скрытые — с пропущенными полями, null и пустыми коллекциями. Порядок документов важен, порядок полей внутри документа — нет. $out и $merge запрещены.
{"collection": "subscribers", "pipeline": [ … ]}
Источник: на данных оператора: абоненты, тарифы и трафик за месяц. Условие пересказано своими словами.
Посмотреть данные, проверить часть pipeline. На зачёт не влияет.
Здесь появится результат отправки.