0

应用 groupyby 后我的 mongo 查询的输出如下:

[
  {
    "_id": "FAIL",
    "count": 2
  },
  {
    "_id": "PASS",
    "count": 3
  }
]

我怎样才能把它转换成这样的键值对:

[
  metric_count:{      
  "FAIL":2,
  "PASS":3,
  "TOTAL":5   //sum of pass count and fail count
 }
]

MongoDB游乐场

4

1 回答 1

1

MongoDB 聚合在管道内构造对象方面具有灵活性。以下管道将帮助您构建所需的结果对象。

但是,如果您正在编写程序,我建议您编写一个小函数将数组对象转换为

首先,要找到总数,我添加了一个$group带有_id: nullto pipeline的阶段。

[
  ...your stages
  {  
    "$group": {
        "_id": null,
        "total": {
          "$sum": "$count"
        }
        "stats": {
          "$push": {
            "k": "$_id",
            "v": "$count"
          }
        },
      }
    },
  }
]

不仅找到总数,我还准备了一个与运算符兼容的数组对象$arrayToObject,帮助我制作最终对象。

然后下面的投影使事情变得正确。

[
  ...your stages
  {
    "$group": {
      "_id": null,
      "total": {
        "$sum": "$count"
      },
      "stats": {
        "$push": {
          "k": "$_id",
          "v": "$count"
        }
      }
    }
  },
  {
    "$project": {
      "_id": 0,
      "metric_count": {
        "$arrayToObject": {
          "$concatArrays": [
            "$stats",
            [
              {
                "k": "TOTAL",
                "v": "$total"
              }
            ]
          ]
        }
      }
    }
  }
]

如您所见,我在投影阶段嵌套管道运算符以根据需要收缩结果对象。concat statstotal以统一的数组形式组合在一起,然后将数组转换为最终对象。$concatArray$arrayToObject

我希望你能在我的管道中找到一些有用的东西。

于 2020-04-12T15:47:31.133 回答