$ фасет агрегации в моногдб - PullRequest
0 голосов
/ 11 мая 2018

Данные моего примера выглядят так:

Category      response
Privacy         1
Mobile          1
Privacy         1
Privacy         0
Phishing        1
Mobile          1
Desktop         1
Desktop         0
Security        1

Я создал агрегированный запрос к group all categories и получаю счет, как показано ниже:

db.cmi5DashboardData.aggregate([
{$group:{_id:'$category',knt:{$sum:'$response'}}},
{$sort:{knt:-1}},
{$project:{_id:0,category:'$_id',count:'$knt'}}
])

Я получаю вывод, как показано ниже:

Category      count
Privacy         2
Mobile          2
Phishing        1
Desktop         1
Security        1

Однако мне нужно group эти данные перейти на следующий уровень, чтобы получить вывод, как показано ниже:

Category      count
Privacy         2
Mobile          2
Others          3

Здесь первые две категории (с большим числом, то есть Privacy & Mobile) считаются сильными, а все остальные категории считаются слабыми и называются другими . Others должен рассчитываться динамически, что является суммой всех других точек данных, кроме точных данных.

Какие-либо предложения или указатели на это могут быть полезны?

Примечание: я использую mongodb 3.6

Обновление: образцы JSON

{Category:'Phishing', response:1),
{Category:'Security', response:1),
{Category:'Privacy', response:1),
{Category:'Privacy', response:1),
{Category:'Privacy', response:0),
{Category:'Mobile', response:1),
{Category:'Mobile', response:1),
{Category:'Desktop', response:1),
{Category:'Desktop', response:0),

1 Ответ

0 голосов
/ 15 мая 2018

Вы должны попробовать $facet агрегирование, чтобы получить желаемый результат, который довольно просто использовать с limit и skip ...

Вы можете проверить вывод здесь

db.collection.aggregate([
  { "$facet": {
    "top": [
      { "$group": {
        "_id": "$Category",
        "response": { "$sum": "$response" }
      }},
      { "$sort": { "response": -1 }},
      { "$limit": 2 }
    ],
    "rest": [
      { "$group": {
        "_id": "$Category",
        "response": { "$sum": "$response" }
      }},
      { "$sort": { "response": -1 }},
      { "$skip": 2 },
      { "$group": {
        "_id": "Others",
        "response": { "$sum": "$response" }
      }}
    ]
  }},
  { "$project": { "data": { "$concatArrays": ["$top", "$rest"] }}},
  { "$unwind": "$data" },
  { "$replaceRoot": { "newRoot": "$data" }}
])
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...