将MongoDB聚合结果重塑为字段值文档

时间:2016-08-08 09:59:44

标签: mongodb mongodb-aggregation

我有一个包含以下形状数据的数据集:

[ {_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阶段,但没有成功。

1 个答案:

答案 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
}