【发布时间】:2012-08-02 13:30:53
【问题描述】:
我还没有提出另一个 Map/Reduce 问题。
我有一个集合“example”,如下所示:
{
"userid" : "somehash",
"channel" : "Channel 1"
}
我的 Map/Reduce 函数如下所示:
var map = function () {
emit(this.channel, {user:this.userid, count: 1});
}
var reduce = function (key, values) {
var result = {total:0, unique:0};
var temp = [];
values.forEach(function (value) {
result.total += value.count;
if (temp.indexOf(value.user) == -1) {
temp.push(value.user);
}
});
result.unique += temp.length;
return result;
}
不幸的是,它给了我一些非常奇怪的结果:
{ "_id" : "Channel 1", "value" : { "total" : NaN, "unique" : 47 } }
{ "_id" : "Channel 2", "value" : { "total" : NaN, "unique" : 12 } }
{ "_id" : "Channel 3", "value" : { "total" : 6, "unique" : 6 } }
似乎value.count 解析为null,似乎“唯一”也不是正确的值。我想要做的是计算每个通道的所有值,并以我可以看到每个用户的唯一值的方式计算它。这意味着,此集合中的文档example 可能会出现多次。我想知道所有时间和独特的时间。
我遵循了本指南:http://www.mongodb.org/display/DOCS/MapReduce#MapReduce-ReduceFunction,但我不知道为什么我的脸上会出现null?很奇怪,关于这个主题有什么好的想法吗?
感谢您的建议和更好的智慧。
【问题讨论】:
-
什么
values传递给reduce?它们是字符串吗?对象?value.count是什么? -
我通过了这个:
{ "userid" : "somehash", "channel" : "Channel 1" },如顶部所述。从代码中可以看出,Userid 是一个字符串,value.count 是 1(整数)。 -
其实@jbabey询问的
values是{'user' : 'userid', 'count' : 1},渠道是关键。您可以将您的输入发布到地图中,或者至少是其中的一个示例吗? -
你能在对象上使用
.forEach吗? -
reduce 阶段从具有相同键的映射中收集所有结果,所以我认为值应该是上面发布形式的对象数组
标签: javascript mongodb mapreduce