0
{
    "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"
      }
    ]
}

上面的结果是我替换 newRoot 后得到的。这是我的分组代码,上面给出了结果

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

现在我需要再次与 active 和 delist 分组。所以,我想要的输出如下

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

以上{ active: 1, inactive: 2 }表示总数activeinactive文档各自数组的计数。

4

1 回答 1

1

我没有看到实际的输入文件。如果顶部的输出来自这个管道,那么在小组赛阶段之前的两个文件看起来像(我不知道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]}}
}}

这将为您提供带有计数的单独文档中的每个位置。如果您需要它们实际上位于单个数组中,请像您一样按 null 分组,但推送计数而不是原始 doc 字段:

{ k:"$_id", v:{active:"$active",inactive:"$inactive"} }
于 2020-03-26T18:33:45.773 回答