2014-10-07 254 views
6

我有以下類型的文檔存儲在一個集合中。MongoDB聚合:組合兩個數組

{ 
    "_id" : "318036:2014010100", 
    "data": [ 
    {"flow": [6, 10, 12], "occupancy": [0.0356, 0.06, 0.0856], time: 0}, 
    {"flow": [2, 1, 4], "occupancy": [0.01, 0.0056, 0.0422], time: 30}, 
    ... 
    ] 
} 

我想計算流量和佔用數組中第一,第二,...,第n個值的聚合值。數組中的順序應該保留。假設我想計算總和。結果應該如下所示:

{ 
    "_id" : "318036:2014010100", 
    "data": [ 
    {"flow": [6, 10, 12], "occupancy": [0.0356, 0.06, 0.0856], sum: [6.0356, 10.006, 12.00856], time: 0}, 
    {"flow": [2, 1, 4], "occupancy": [0.01, 0.0056, 0.0422], sum: [2.01, 1.0056, 4.0422], time: 30}, 
    ... 
    ] 
} 

我試圖通過使用聚合框架,但我目前的做法不保留排序來解決這個併產生得多款項。

db.sens.aggregate([ 
    {$match: {"_id":/^318036:/}}, 
    {$limit: 1}, 
    {$unwind: "$data"}, 
    {$unwind: "$data.flow"}, 
    {$unwind: "$data.occupancy"}, 
    { 
    $group: { 
     _id: {id: "$_id", time: "$data.time", o: "$data.occupancy", f: "$data.flow", s: {$add: ["$data.occupancy", "$data.flow"]}} 
    } 
    }, 
    { 
    $group: { 
     _id: {id: "$_id.id", time: "$_id.time"}, occ: { $addToSet: "$_id.o"}, flow: {$addToSet: "$_id.f"}, speed: {$addToSet: "$_id.s"} 
    } 
    } 
]) 

我不知道是否有可能解決這一問題與聚合框架,所以使用的MapReduce解決方案也將被罰款。我怎樣才能產生想要的結果?

+0

我相信這https://jira.mongodb.org/browse/SERVER-5919防止您與聚合框架解決問題。另一方面,完全可以通過縮小地圖來完成。 – joao 2014-10-07 10:25:02

+0

我個人對於你期望的結果感到有些莫名其妙。 「套件」沒有訂購。首席技術官這樣說,這基本上是一個通用的數學原理。 「$ group」上的「雙泵」並不是必須的,因爲它可以在一個階段完成。這基本上可以讓我回到「你想達到什麼」的結果給你的原始輸入?似乎沒有明確說明。 – 2014-10-07 10:37:33

+0

我不相信在2.6彙總框架中有辦法做到這一點。考慮map/reduce或客戶端(預)處理。 – wdberkeley 2014-10-07 15:13:40

回答

0

既不聚合框架,也沒有地圖的替代解決方案/減少:

db.sens.find().forEach(function (doc) { 
    doc.data.forEach(function(dataElement) { 
     var sumArray = []; 
     for (var j = 0; j < dataElement.flow.length; j++) { 
     sumArray[j] = dataElement.flow[j] + dataElement.occupancy[j]; 
     } 
     dataElement.sum = sumArray; 
     collection.save(doc); 
    }); 
});