在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 }