应用 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
}
]
应用 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 聚合在管道内构造对象方面具有灵活性。以下管道将帮助您构建所需的结果对象。
但是,如果您正在编写程序,我建议您编写一个小函数将数组对象转换为
首先,要找到总数,我添加了一个$group
带有_id: null
to 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 stats和total以统一的数组形式组合在一起,然后将数组转换为最终对象。$concatArray
$arrayToObject
我希望你能在我的管道中找到一些有用的东西。