在MongoDB中使用MapReduce
试着用MapReduce聚合存储在MongoDB中的位置信息,目标是推断“在哪里停留了多久”。
文件中预计存储了用户ID和位置信息(GeoHash)。
document = {
user_id: 1,
geohash: "xn75gknsuf"
}
定义地图映射器。对于每一个GeoHash,设置为1。
// mapper定義
var mapper = function() {
emit(this.geohash, 1)
}
Reducer的定义。传入values参数是经过Mapper处理的数组。如果有3个相同的GeoHash值,则变成一个数组[1, 1, 1]。可以使用Array.sum()来求和。
// reducer定義
var reducer = function (key, values) {
return Array.sum(values);
}
对geohashed_location集合执行MapReduce操作。将mapper和reducer作为参数传递,并可选择性地传递输出集合作为选项。
// MapReduce実行
db.geohashed_location.mapReduce(
mapper,
reducer,
{
query: {},
out: "geohashed_location_result"
}
)
最后的结果。
> db. geohashed_location_result.find()
{ "_id" : "wvuw6nyxnm", "value" : 41 }
{ "_id" : "wvuw6nyxnp", "value" : 40 }
{ "_id" : "wvuw6nyxnq", "value" : 15 }
{ "_id" : "wvuw6nyxnr", "value" : 41 }
{ "_id" : "wvuw6nyxp1", "value" : 12 }
{ "_id" : "wvuw6nyxp4", "value" : 21 }
{ "_id" : "wvuw6nyxpm", "value" : 1 }