当我使用mongodb的map-reduce时,为什么会嵌套?

时间:2018-08-13 06:08:10

标签: mongodb mapreduce

我将代码插入mongo:

for (var i=0; i<1000; i++) {
db.test.insert({ "name" : "user"+i, "age":i%17 , "created_at" : new Date() });
} 

,地图功能是

var m = function(){ emit(this.age,this.name); }

reduce函数是

var r=function(key,values){ var ret={age:key,names:values}; return ret;}

但是,当我运行代码

db.runCommand({mapreduce:"test",map:m,reduce:r,     out:"t_age_names"} )

我得到17 json,每个人都像

  

{“ _id”:8,“值”:{“年龄”:8,“名称”:[{“年龄”:8,“名称”:   [{“ age”:8,“ names”:[“ user8”,“ user25”,“ user42”,“ user59”,   “ user76”,“ user93”,“ user110”,“ user127”,“ user144”,“ user161”,   “ user178”,“ user195”]},“ user212”,“ user229”,“ user246”,“ user263”,   “ user280”,“ user297”,“ user314”,“ user331”,“ user348”,“ user365”,   “ user382”,“ user399”]},{“年龄”:8,“名称”:[{“年龄”:8,   “名称”:[“ user416”,“ user433”,“ user450”,“ user467”,“ user484”,   “ user501”,“ user518”,“ user535”,“ user552”,“ user569”,“ user586”]},   “ user603”,“ user620”,“ user637”,“ user654”,“ user671”,“ user688”,   “ user705”,“ user722”,“ user739”,“ user756”,“ user773”,“ user790”]},   {“ age”:8,“ names”:[“ user807”,“ user824”,“ user841”,“ user858”,   “ user875”,“ user892”,“ user909”,“ user926”,“ user943”,“ user960”,   “ user977”,“ user994”]}]}}

为什么嵌套?

为什么嵌套?
每个数组的长度为12,似乎是由emit函数引起的,是吗?

1 个答案:

答案 0 :(得分:0)

您的reduce违反了[至少] the requirements之一:

  

返回对象的类型必须与map函数发出的值的类型相同

因此,更改reduce的输出或map的输出。