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+...)+...

阅读 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数就把他+上,这样做效率是很低的

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
宣传栏