我有一个包含以下形状数据的数据集:
[ {_id: "1",
aa1: 45, aa2: 56,
bb1: 90, bb2: 78,
cc1: 34, cc2: 98 },
{_id: "2",
aa1: 76, aa2: 56,
bb1: 45, bb2: 67,
cc1: 75, cc2: 87 } ]
在这个数据上我执行一个MongoDB聚合管道:
db.colleciton.aggregate([
{ $project: {
"_id": "$_id",
"aaa": { $avg: ["$aa1","$aa2"] },
"bbb": { $avg: ["$bb1","$bb2"] },
"ccc": { $avg: ["$cc1","$cc2"] }
}
},
{ $group: {
"_id": "AvgCalc",
"aaa": { $avg: "$aaa" },
"bbb": { $avg: "$bbb" },
"ccc": { $avg: "$ccc" }
}
}
])
以格式显示我的结果:
[ {_id: "AvgCalc",
aaa: 67,
bbb: 55,
ccc: 90} ]
我想在聚合中将其转换为我的结果:
[ {field: "aaa", value: 67},
{field: "bbb", value: 55},
{field: "ccc", value: 90} ]
有没有办法通过聚合实现这一目标?我想将此作为管道的最后阶段。我尝试添加$ project阶段,但没有成功。
答案 0 :(得分:4)
此管道应该为您提供所需的结果
db.getCollection('yourColl').aggregate([
{
$project: {
"_id": "$_id",
"aaa": { $avg: ["$aa1","$aa2"] },
"bbb": { $avg: ["$bb1","$bb2"] },
"ccc": { $avg: ["$cc1","$cc2"] }
}
},
{
$group: {
"_id": "AvgCalc",
"aaa": { $avg: "$aaa" },
"bbb": { $avg: "$bbb" },
"ccc": { $avg: "$ccc" }
}
},
{
$project: {
"items": [
{name: {$literal: "aaa"}, value: "$aaa"},
{name: {$literal: "bbb"}, value: "$bbb"},
{name: {$literal: "ccc"}, value: "$ccc"}
]
}
},
{
$unwind: {
path: "$items"
}
},
{
$project: {
_id: 0,
field: "$items.name",
value: "$items.value"
}
}
])
对于您的样本数据,以前的输出是
/* 1 */
{
"_id" : "AvgCalc",
"aaa" : 58.25,
"bbb" : 70.0,
"ccc" : 73.5
}
并且使用新管道输出就像这样
/* 1 */
{
"field" : "aaa",
"value" : 58.25
}
/* 2 */
{
"field" : "bbb",
"value" : 70.0
}
/* 3 */
{
"field" : "ccc",
"value" : 73.5
}