mongodb 不同field的sub-document元素求和

新手上路,请多包涵

我有一些按照小时时间统计的数据:

{
  "name": "张三",
  "hour": {
    "0": {
      "num": 11
    },
    "1": {
      "num": 12    
    },
    ...
},
{
  "name": "李四",
  "hour": {
    "0": {
      "num": 21
    },
    "1": {
      "num": 22  
    }
    ...
}
...

想把"0"--"9"十个时间点所有人的num数加起来,该如何操作?
即例子中的:(11+12+...) + (21+22+...)+...
或(11+21+...)+ (12+22+...)+...

阅读 2.2k
2 个回答

可以用mapReduce做,map里用固定值作为key,并计算单个人十个时间点的总和作为value;reduce里再进行所有人的求和。

db.collection.mapReduce(function(){
    const hourDict = this.data.hour;
    const personSum = hourDict.0.num + hourDict.1.num + ...;
    emit('allHours', personSum);
}, function(key, values){
    return Array.sum(values)
}, {
    out: 'total'    
})

MongoDB是不适合做计算这个场景,你可以增加一个统计字段,每更新num数就把他+上,这样做效率是很低的