MongoDb汇总多列

时间:2013-12-02 01:02:24

标签: mongodb mapreduce

我正在涉足mongoDb并试图使用map reduce查询。我需要总结来自不同列的多个值(num1,num2,num3,num4,num5)。关闭本指南http://docs.mongodb.org/manual/tutorial/map-reduce-examples/。在那里,我试图改变那里的第一个例子来总结所有的值。

这就是我正在尝试/尝试的内容。我不确定它是否可以采用这样的多个值,我只是假设。

var query1 = function(){ emit("sumValues", this.num1, this.num2, this.num3, this.num4, this.num5)};

    var query1query = function(sumValues, totalSumOfValues){ return Array.sum(totalSumOfValues); }

    db.testData.mapReduce( query1, query1query, {out: "query_one_results"})

这是我得到的错误。 Sun Dec 1 18:52:24.627 JavaScript执行失败:map reduce失败:{         “errmsg”:“异常:JavaScript执行失败:错误:fast_emit在'ction(){emit(\”sumValues \“,this.c'”附近有2个参数,         “code”:16722,         “ok”:0

还有另一种方法来总结所有这些价值观吗?或者我的错误在哪里。

我也尝试了这个,它似乎工作。但是当我在它创建的文件上执行.find()时,它似乎只是检索sum5的值并将它们加在一起。

var query1 = function(){ emit({sum1: this.sum1,sum2: this.sum2,sum3: this.sum3,sum4: this.sum4,sum5:  this.sum5},{count:1});}
 var query1query = function(key, val){ return Array.sum(val); };
 db.testData.mapReduce( query1, query1query, {out: "query_one_results"})
{
        "result" : "query_one_results",
        "timeMillis" : 19503,
        "counts" : {
                "input" : 173657,
                "emit" : 173657,
                "reduce" : 1467,
                "output" : 166859
        },
        "ok" : 1,
}

好的,我想我明白了。这就是我最终做的事情

> var map1= function(){
... emit("Total Sum", this.sum1);
... emit("Total Sum", this.sum2);
... emit("Total Sum", this.sum3);
... emit("Total Sum", this.sum4);
... emit("Total Sum", this.sum5);
... emit("Total Sum", this.sum6);
… };

> var reduce1 = function(key, val){
... return Array.sum(val)
... };
> db.delayData.mapReduce(map1,reduce1,{out:'query_one_result'});
{
        "result" : "query_one_result",
        "timeMillis" : 9264,
        "counts" : {
                "input" : 173657,
                "emit" : 1041942,
                "reduce" : 1737,
                "output" : 1
        },
        "ok" : 1,
}

> db.query_one_result.find()
{ "_id" : "Total Sum", "value" : 250 }

1 个答案:

答案 0 :(得分:3)

您正在向后获取需要在地图中发出的两个值。第一个代表一个唯一的键值,您可以在其上聚合某些内容。第二个是你要聚合的东西。

由于您试图获得整个集合的一个总和(似乎),您需要输出单个键,然后输出值,您需要输出每个文档的四个字段的总和。

map = function() { emit(1, this.num1+this.num2+this.num3+this.num4+this.num5); }
reduce = function(key, values) { return Array.sum(values);   }

只要在每个文档中设置num1到num5,这都可以工作 - 只需检查每个字段是否存在就可以使函数更加健壮,如果存在,则添加其值。

在现实生活中,您可以使用聚合框架更快更简单地执行此操作:

db.collection.aggregate({$group:{{$group:{_id:1, sum:{$sum:{$add:["$num1","$num2","$num3","$num4","$num5"]}}}})