Mongodb是否可以聚合对象? [英] Mongodb Is it possible to aggregate an object?

查看:61
本文介绍了Mongodb是否可以聚合对象?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在尝试汇总此文档中的数据包总数.

I am trying to aggregate the total sum of packets in this document.

{
    "_id" : ObjectId("51a6cd102769c63e65061bda"),
    "capture" : "1369885967",
    "packets" : {
        "0" : "595",
        "1" : "596",
        "2" : "595",
        "3" : "595",
        ...
    }
}

我能找到的最接近的是

db.collection.aggregate({ $match: { capture : "1369885967" } }, {$group: { _id:null, sum: {$sum:"$packets"}}});

但是它返回总和0,这显然是错误的.

However it returns sum 0, which is obviously wrong.

{ "result" : [ { "_id" : null, "sum" : 0 } ], "ok" : 1 }

如何获取所有数据包的总和?

How do I get the sum of all the packets?

推荐答案

由于您将值保存在对象而不是数组中,因此需要使用mapReduce.

Since you have the values in an object instead of an array, you'll need to use mapReduce.

// Emit the values as integers

var mapFunction = 
  function() {
    for (key in this.packets) {
      emit(null, parseInt(this.packets[key]));
    }
  }

// Reduce to a simple sum

var reduceFunction = 
  function(key, values) {
    return Array.sum(values);
  }

> db.collection.mapReduce(mapFunction, reduceFunction, {out: {inline:1}})
{
    "results" : [
        {
            "_id" : null,
            "value" : 2381
        }
    ],
    "ok" : 1,
}

如果可能的话,应该将值作为数字类型的数组发出,因为这会给您更多选择(即聚合),并且(除非数据集很大)可能会带来性能上的好处.

If at all possible, you should emit the values as an array of a numeric type instead since that gives you more options (ie aggregation) and (unless the data set is large) probably performance benefits.

这篇关于Mongodb是否可以聚合对象?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆