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