Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/mongodb/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/143.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
mongodb:只有一个结果时减少函数而不是操作_Mongodb - Fatal编程技术网

mongodb:只有一个结果时减少函数而不是操作

mongodb:只有一个结果时减少函数而不是操作,mongodb,Mongodb,我需要做加权平均 您是否按以下方式进行编码 db.runCommand( { mapreduce : "<collecton>" , map: function () { emit ({nkey: this.nkey}, {price: this.tags["31"], qty: this.tags["32"]}); }, reduce: function(key, vals) { var ret = {wavg:0}; var mul1 = 0.0; var sum1 = 0.0;

我需要做加权平均

您是否按以下方式进行编码

db.runCommand(
{ mapreduce : "<collecton>" ,
map: function ()
{
emit ({nkey: this.nkey}, {price: this.tags["31"], qty: this.tags["32"]});
},
reduce: function(key, vals)
{
var ret = {wavg:0};
var mul1 = 0.0;
var sum1 = 0.0;
for (var i=0;i<vals.length;i++)
{ mul1 += vals[i].price * vals[i].qty;
  sum1 += vals[i].qty;
}
ret.wavg = mul1/sum1;
return ret;
},
out: 'res2', verbose: true
}
);

> db.res2.find()
{ "_id" : { "nkey" : "key1" }, "value" : { "wavg" : 311.7647058823529 } }
{ "_id" : { "nkey" : "ke2" }, "value" : { "wavg" : 585.7142857142857 } }
{ "_id" : { "nkey" : "key3" }, "value" : { "price" : 1000, "qty" : 110 } }
{ "_id" : { "nkey" : "key4" }, "value" : { "wavg" : 825 } }
db.runCommand(
{mapreduce:“,
映射:函数()
{
emit({nkey:this.nkey},{price:this.tags[“31”],qty:this.tags[“32”});
},
减少:功能(键、VAL)
{
var ret={wavg:0};
var mul1=0.0;
var sum1=0.0;
for(var i=0;i db.res2.find()
{u id:{nkey:“key1”},value:{“wavg”:311.7647058823529}
{u id:{nkey:“ke2”},value:{“wavg”:585.7142857142857}
{u id:{nkey:“key3”},值:{“价格”:1000,“数量”:110}
{u id:{nkey:“key4”},value:{“wavg”:825}
如果您注意到,在最终减速器输出(第三行)中,它实际上无法通过reduce功能。键只出现一次,因此将发出一个结果。但我仍然希望reduce功能对其进行操作,以获得加权平均值。我不能在只有一次键出现的情况下继续处理价格和数量,我也需要该键的加权平均值


有什么方法可以实现这一点吗?

这就是mapReduce的基本工作原理,因为当您只有一个结果时,不会调用reducer。但是您可以随时通过阶段更改这些结果:

db.runCommand({
“mapreduce”:“,
“映射”:函数(){
散发(
{“nkey”:this.nkey},
{“价格”:this.tags[“31”],数量:this.tags[“32”]}
);
},
“减少”:功能(键、VAL){
var ret={“wavg”:0};
var mul1=0.0;
var sum1=0.0;

对于(var i=0;i使用finalize函数代替headit工作,谢谢。但是在Hadoop map reduce中,即使只有一个reduce,reduce也会运行row@user3639648对此不太确定,但mapReduce的一般规范是将同一个键的多个发射组合在一起,如果该键只有一个值,那么Reduce应该没有任何内容呃,要做的事。这至少是谷歌原始文件中的定义,所以这正是MongoDB实现所做的。这在手册页面中被给出的链接引用。