2015-04-14 92 views
7

我有兩個文件這樣MongoDB的陣列聚集

{ "_id" : ObjectId("552cd26276b783ed66031cc4"), "vals" : [ 2, 3, 4, 5 ] } 
{ "_id" : ObjectId("552cd26e76b783ed66031cc5"), "vals" : [ 1, 2, 3, 4 ] } 

我需要這兩個列表的聚集總和

預期輸出:

[3, 5, 7, 9] 

即[2 + 1,3 + 2 ,4 + 3,5 + 4]

我甚至不確定這是否可以在MongoDB中使用。有關於此的任何信息?

+0

是你總是一樣大小的'vals'數組嗎? – Yogesh

+0

@yogesh號但我想知道如果大小相同,是否可以解決。 – thavan

+0

我認爲這將不可能使用mongo查詢。並從我身邊+1。 – Yogesh

回答

0

對不起,我沒有正確回答這個問題。我在想如何總結每個對象的數組。不在兩個對象之間添加數組。

(上述編輯)

我是新來這一點,但我認爲你要使用的聚合運算符$開卷,將發生爆炸的數組,那麼$總結了「丘壑」。它應該是這樣的

db.Test.aggregate([{$unwind:"$vals"},{$group:{_id:"$_id","TotalVals":{$sum:"$vals"}}}]) 

參考這裏http://docs.mongodb.org/manual/reference/operator/aggregation-group/

這($退卷)的運營商將創建一個文檔數組中的每個值,看你的內存更大的集合。這($ unwind)是在我相信的記憶中完成的。

0

聚合框架不僅僅是聚合管道。

當然,你也可以使用地圖減少很簡單的功能:

var map_function = function(){ 
    for(var i=0;i<this.vals.length;i++){ 
     emit(i,this.vals[i]); 
    } 
} 
var reduce_function = function(key, values){ 
    return Array.sum(values) 
} 

的輸出文件的目錄,其中_id是指數和value是總和。像這樣:

[{u'_id': 0.0, u'value': 3.0}, 
{u'_id': 1.0, u'value': 5.0}, 
{u'_id': 2.0, u'value': 7.0}, 
{u'_id': 3.0, u'value': 9.0}] 
1

只是爲了更新。在即將發佈的mongoDB 3.2的聚合框架中,這是可能的。他們添加了一個新功能來獲取名爲includeArrayIndex的mongoDB聚合的$ unwind階段的數組展開索引。

使用此功能,您可以使用表格的彙總查詢:

db.collection.aggregate(
    {$unwind: { path: "$vals", includeArrayIndex: "arrayIndex" }}, 
    {$group: { '_id': '$arrayIndex', sum : {$sum: '$vals'}}}, 
    {$sort: { '_id': 1 }}, 
    {$group : { '_id': null, valSum: {$push: '$sum'}}} 
) 

說明

  • 退繞操作解開丘壑陣列和還預測開卷的數組索引。因此,我們的想法是將相似的索引進行分組,以便我們可以對它們進行求和
  • 然後,我們在對vals元素進行求和時根據arrayIndex進行分組。在這個階段,我們已經完美的概括對應的索引元件
  • 接下來我們排序基於arrayIndex從而爲最終結果陣列製備
  • 接下來我們組中的所有文件和推款項稱爲valSum
陣列

輸出:

{ '_id': null, valSum: [3, 5, 7, 9] } 

這種方法的主要優點是,你不必有相同長度的陣列。它也可以接受任意數量的輸入文件。感謝includeArrayIndex功能。

乾杯!