我的 MapReduce 函数有问题 - 目标是获取某个 lat/lng 内的顶级场所列表,group by vid
,order by distinct user_id
。
这是一个示例数据集:
{ "_id" : ObjectId("51f9234feb97ff0700000046"), "checkin_id" : 39286249, "created_at" : ISODate("2013-07-31T14:47:11Z"), "loc" : { "lat" : 42.3672, "lon" : -86.2681 }, "icv" : 1, "ipv" : 1, "vid" : 348442, "user_id" : 151556, "bid" : 9346, "pid" : 549 }
{ "_id" : ObjectId("51f9234b488fff0700000006"), "checkin_id" : 39286247, "created_at" : ISODate("2013-07-31T14:47:07Z"), "loc" : { "lat" : 55.6721, "lon" : 12.5576 }, "icv" : 1, "ipv" : 1, "vid" : 3124, "user_id" : 472486, "bid" : 7983, "pid" : 2813 }
...
这是我的地图功能:
map1 = function() {
var tempDoc = {};
tempDoc[this.user_id] = 1;
emit(this.vid, {
users: tempDoc,
count: 1
});
}
并减少:
reduce1 = function(key, values) {
var summary = {
users: {},
total: 0
};
values.forEach(function (doc) {
// increment total for every value
summary.total += doc.count;
// Object.extend() will only add keys from the right object that do not exist on the left object
Object.extend(summary.users, doc.user);
});
return summary;
};
我的地理查询:
var d = Date("2013-07-31T14:47:11Z");
var geo_query = {loc: {$near: [40.758318,-73.952985], $maxDistance: 25}, "icv":1, "created_at": {$gte: d}};
最后是 mapReduce 查询:
var res = db.myColelction.mapReduce(map1, reduce1, { out : { inline : 1 }, query : geo_query });
返回的结果与 reduce 函数匹配,但未命中 finalize1 函数:
...
{
"_id" : 609096,
"value" : {
"users" : {
"487586" : 1
},
"count" : 1
}
},
{
"_id" : 622448,
"value" : {
"users" : {
"313755" : 1,
"443180" : 1
},
"total" : 4
}
},
...
此时,我认为我有一个很好的结果集,但是该$near
函数只扫描附近的 100 个场地,我想扫描所有场地(所有符合此半径(25m)的文档,并查看所有场地 -将它们分组,并计算该时间段内的唯一用户数。我四处搜索,查看文档,但不确定解决方案。有接受者吗?
对我来说,最终结果将是排序并通过“total”属性限制结果。理想情况下,我想按总 desc 和限制 15 进行排序。