5

我有一个数据集合,其中包含以下形状的数据:

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

4

1 回答 1

5

此管道应为您提供所需的结果

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
}
于 2016-08-08T12:27:04.613 回答