我正在涉足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 }
答案 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"]}}}})