Mongodb 地图上的Reduce函数Reduce显示不正确的结果--为什么?
我有一个数据结构,可以跟踪不同城市的人:Mongodb 地图上的Reduce函数Reduce显示不正确的结果--为什么?,mongodb,mapreduce,Mongodb,Mapreduce,我有一个数据结构,可以跟踪不同城市的人: //in db.persons { name: "John", city: "Seattle }, { name: "Bill", city: "Portland" } 我想运行map reduce以获得每个城市有多少人的列表,因此结果如下所示: { _id: "Seattle", value: 10 } map = function(){ var city = this.city emit(city, 1); };
//in db.persons
{
name: "John",
city: "Seattle
},
{
name: "Bill",
city: "Portland"
}
我想运行map reduce以获得每个城市有多少人的列表,因此结果如下所示:
{
_id: "Seattle",
value: 10
}
map = function(){
var city = this.city
emit(city, 1);
};
reduce = function(key, values){
var result = 0;
values.forEach(function(value){
result += 1;
});
return result;
}
我的map reduce函数如下所示:
{
_id: "Seattle",
value: 10
}
map = function(){
var city = this.city
emit(city, 1);
};
reduce = function(key, values){
var result = 0;
values.forEach(function(value){
result += 1;
});
return result;
}
非常简单的东西,我想它会把城市
作为一个键,然后为找到的每个匹配城市添加一个。但是,在生成的映射reduce上,该值被一个很大的因子关闭。将我的reduce功能切换到:
reduce = function(key, values){
var result = 0;
values.forEach(function(value){
result += value;
});
return result;
}
将值
添加到结果中(根据我的emit
函数的理解,应该是1)返回正确的结果
为什么结果不同?在reduce函数中,我的
值不是1吗?这是因为MongoDB可以为同一个键多次调用reduce函数。下面是一个简单的示例:
假设您的数据库中只有三个文档,每个文档的“城市”都是“西雅图”。在发射阶段之后,您将拥有一组发射的对象,这些对象看起来像
{'Seattle':1}。{'settle':1}。{'settle':1}
发射阶段完成后,减少阶段开始。在最简单的情况下,reduce函数将被称为reduce('sattle',[1,1,1])
。在这种情况下,您的第一个函数将正常工作。但是,reduce函数可以调用多次:
reduce('sattle',[1,1])->{'sattle':2},{'sattle',1}
reduce('sattle',[2,1])
在这种情况下,第一个reduce函数将在第二次reduce调用后返回2
,因为值列表中有两项。在第二个reduce函数中,您可以正确地将这些值相加,而不仅仅是对它们进行计数,这将给出正确的答案
我个人认为,对于为什么需要为其值输入数组使用交换和关联的reduce函数,用户可以更好地解释这一点。您的reduce
函数似乎不起作用:哪一个?第一个还是第二个?医生都说了reduce
应返回可传回reduce
的结果。类似于{城市:“西雅图”,人口:123}
。如果population
键不存在,则假定它是1
.Hmm。。。嗯,它确实有效。从reduce函数返回一个对象似乎会把事情搞砸。我要再看一眼那些文档[编辑]它爆炸了,因为我用一个任意键从reduce函数返回一个对象,然后reduce在该键上运行n次试图减少它这与结果的批处理有关,你测试的cirties中有多少人?当您执行emit(city,1)
时,将1
合并到键city