在应用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
}
]
答案 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
将数组转换为最终对象。
我希望您会从我的管道中找到有用的东西。