如何在MongoDB中使用Map / Reduce?

时间:2011-06-13 16:17:49

标签: php mapreduce mongodb

我无法解决MongoDB中map / reduce的工作原理。我有一个包含字段的集合:areacode, state, county, zip, city, lat, lon列出了美国的每个邮政编码以及相应的县,州等。

我希望能够查询给定状态下的所有县或城市。所以基本上某种查询查找“State = MI”的所有记录。在这种情况下,返回了大约900条记录。我如何按县分组,以便我只获得该州的83个县?我不想使用distinct,因为我希望能够按字母顺序排序,也可能拉出lat / long。

关于如何使用map / reduce来完成此任务的任何建议?我觉得它很基本,我只是想不出来。

3 个答案:

答案 0 :(得分:44)

我没有任何PHP经验,但如果您想了解MongoDB Map-Reduce的工作原理,那么您可以查看一下..

enter image description here

有关详细信息,请查看this

答案 1 :(得分:3)

  

我如何按县分组,以便我得到该州的83个县?

正如您所描述的那样,这需要distinct command

  

我不想使用distinct,因为我希望能够按字母顺序排序

distinct命令将返回一组结果。如果它们尚未排序,那么对它们进行排序应该是微不足道的。

  

......也可能拉出纬度/经度。

你想拉出什么纬度/长度?根据你的模式,你有城市的纬度/经度,但我没有看到一个县的纬度/经度。

  

有关如何使用map / reduce来完成此任务的任何建议吗?

此时,您必须使用distinct或类似的Map / Reduce操作。

但是,我不清楚这会提供您正在寻找的内容,因为当您拥有城市数据时,我不清楚您打算如何提取县的纬度/经度数据。

如果您可以提供一些样本输入和预期输出,那么我可以提供更具体的答案。

答案 2 :(得分:0)

我是MongoDB MapReduce编程的初学者,但会尝试查看它是否有帮助,定义Map Reduce函数,

您的地图功能如下:

function() { 
   emit( this.county, {count: 1} ); 
}

你的Reduce功能如下:

function(key, values) { 
    var result = {count: 0};
    //Skip aggregation step if not needed 
    values.forEach(function(value) {     
       result.count += value.count;
    }); 
    return result;  
}

并将您的查询条件与Map Reduce一起传递,上面的伪代码应该为您提供每个县的记录#和县名单本身。如果您只需要县,您可以简单地使用reduce函数跳过聚合,在这种情况下,您应该获得县的列表。

让我知道是否有更好的方法来实现。