2016-06-09 82 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])