mongoDB aggegation管道可以从键和值创建对象吗?

时间:2015-11-13 00:18:12

标签: mongodb aggregation-framework

我有一个mongoDB聚合管道,它目前以这种形式产生数据:

{ year:2014, item:'a', value:1}
{ year:2014, item:'b', value:2}
{ year:2014, item:'c', value:3}
{ year:2015, item:'a', value:2}
{ year:2015, item:'b', value:3}
{ year:2015, item:'c', value:4}

将此转换为的最佳方式是:

{year:2014, a:1, b:2, c:3}
{year:2015, a:2, b:3, c:4}

我想这可以通过map-reduce完成,但我想知道是否有人使用聚合管道进行优雅的方式。

顺便说一句,可能有数百种不同的可能项目值 - 不仅仅是我在上面的例子中使用的三个(a,b,c)。在下面使用Yathish的方法太多了。

1 个答案:

答案 0 :(得分:1)

请试试下面的代码:

db.[collection].aggregate([
{
 $project : { year : 1,     
             "newKey" : { "$cond" : 
                              { if :   { "$eq" :["$item","a"] }, 
                                then : { "a" : "$value" }, 
                                else : { "$cond" : 
                                              { if : { "$eq": ["$item","b"] }, 
                                                then : {"b":"$value"}, 
                                                else : { $cond :
                                                             { if:{"$eq":["$item","c"] },
                                                               then: { "c":"$value" },
                                                               else : false 
                                                             }
                                                       }
                                               }
                                       } 
                               } 
                        }

            }
},
{
 $group : { 
            _id:"$year", 
            newKey : { $push : "$newKey" }
          }
}
]);