Как далее группировать объект после замены Root в mongodb - PullRequest
0 голосов
/ 26 марта 2020
{
    "169v55": [
      {
        "code": "2001",
        "active": true,
        "delist": false
      }
    ],
    "SLO1019jkf": [
      {
        "code": "MOUNTY2026",
        "active": false,
        "delist": false,
        "createdAt": "2019-12-26T15:36:51.819Z"
      },
      {
        "code": "MOUNTY2027",
        "active": false,
        "delist": false,
        "createdAt": "2019-12-26T16:25:32.437Z"
      },
      {
        "code": "MOUNTY2054",
        "active": false,
        "delist": false,
        "createdAt": "2020-02-17T05:47:28.558Z"
      }
    ]
}

Выше результата я получил после замены нового Root. Вот мой код группировки, который приведен выше результата

{
    $group: group
},
{
    $project: {
      doc: "$doc",
      date: date,
      type: type
    }
},
{
    $group: {
      _id: null,
      locations: {
        $push: {
          k: "$_id",
          v: "$doc"
        }
      }
    }
},
{
    $replaceRoot: {
      newRoot: {
        $arrayToObject: "$locations"
      }
    }
}

Теперь мне нужно снова сгруппировать с активным и delist. Итак, вывод, который я хочу получить, как показано ниже

{
  "169v55": {
    active: 1,
    inactive: 2
  },
  "SLO1019jkf": {
    active: 0,
    inactive: 3
  }
}

Выше { active: 1, inactive: 2 } означает общее количество active и inactive документов соответствующего массива.

1 Ответ

1 голос
/ 26 марта 2020

Я не вижу фактических входных документов. Если выходные данные сверху были получены из этого конвейера, два документа прямо перед групповым этапом выглядели так (я не могу сказать, что содержалось в type):

{
    _id: "169v55",
    doc:{
        "code": "2001",
        "active": true,
        "delist": false
      },
    type: unknown
}

и

{
    _id: "SLO1019jkf",
    doc:{
        "code": "MOUNTY2026",
        "active": false,
        "delist": false,
        "createdAt": "2019-12-26T15:36:51.819Z"
      },
    type: unknown
}

Таким образом, если бы вы собирались в группы на основе местоположения, вы могли бы суммировать активные и неактивные данные:

{$group:{
    _id:"$_id",
    active: {$sum:{$cond:[{$eq:["$active",true]},1,0]}},
    inactive: {$sum:{$cond:[{$eq:["$active",false]},1,0]}}
}}

Это даст вам каждое местоположение в отдельных документах с подсчетами. Если вам нужно, чтобы они действительно были в одном массиве, группируйте по нулю, как вы, но pu sh считает вместо исходного поля do c:

{ k:"$_id", v:{active:"$active",inactive:"$inactive"} }
...