2016-06-09 69 views
0

我在MongoDB的以下數據集:的MongoDB - 骨料領域內和對象

{ 
    _id: 574718ec2bc91f565db33897, 
    topic: { 
    T69: 0.9566255761668587 
    } 
}, 
{ 
    _id: 574718ec2bc91f565db33899, 
    topic: { 
    T257: 0.046038051058499445, 
    T2: 1.8206715756325407, 
    T31: 0.08838710118945285 
    } 
}, 
{ 
    _id: 574718ec2bc91f565db33889, 
    topic: { 
    T95: 0.37718859499517865, 
    T40: 0.2620479937270479, 
    T2: 0.3594989449758472, 
    T1: 1.9161288780994465 
    } 
} 

我一直在試圖建立一個聚合查詢返回的所有主題的總和,TN,在該組所有這些文件。任何人都可以給我一個正確的方向指針嗎?由於我是MongoDB的新手,我無法找到這個問題的答案(儘管這似乎與$unwind an object in aggregation framework有關)。

+0

話題是一個數組或子文檔? – profesor79

+0

@ profesor79 topic是一個子文檔,T1,T2,...,Tn是這個子文檔中的字段。 –

+0

展開作品與我的問題的原因... – profesor79

回答

0

我認爲你不能用mongoDB聚合框架(它可以更好地處理子集合的集合/數組),但對於map/reduce非常簡單。例如,您可以嘗試使用:

db.YOURCOLLECTION.mapReduce(
    function() { 
    var topic = this.topic; 
    Object.keys(topic).forEach(function(k) { 
     emit(k, topic[k]); 
    }); 
    }, 
    function (key, values) { 
    return Array.sum(values); 
    } 
); 
0

我們最好的選擇是mapReduce。在我們的map函數中,我們只需要遍歷「topic」屬性併發出值。要獲得集合中的總金額,我們需要「發出」null作爲關鍵值。

在reduce函數中,我們只需使用Array.sum方法返回總和。

db.coll.mapReduce(function() { 
    for (var key in this.topic) { 
     if (Object.prototype.hasOwnProperty.call(this.topic, key)) { 
      emit(null, this.topic[key]) 
     } 
    }}, 
    function(key, value) { 
     return Array.sum(value); 
    }, 
    { "out": { "inline": 1 } } 
) 

主要生產:

{ 
    "results" : [ 
     { 
      "_id" : null, 
      "value" : 5.826586715844872 
     } 
    ], 
    "timeMillis" : 26, 
    "counts" : { 
     "input" : 3, 
     "emit" : 8, 
     "reduce" : 1, 
     "output" : 1 
    }, 
    "ok" : 1 
} 

如果你想爲每個文檔「求和」,只需撥打emit(this._id, this.topic[key])地圖中的功能,而不是emit(null, this.topic[key])