MongoDB将此转换为键值对

时间:2020-04-12 11:40:51

标签: mongodb mongodb-query

在应用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 Playground

1 个答案:

答案 0 :(得分:1)

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

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

首先,要找到总计,我将$group_id: null的阶段添加到管道

[
  ...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"
              }
            ]
          ]
        }
      }
    }
  }
]

如您所见,我在投影阶段中嵌套了管道运算符以根据需要收缩结果对象。 $concatArray以统一数组形式同时连接统计总计,然后$arrayToObject将数组转换为最终对象。

我希望您会从我的管道中找到有用的东西。