【发布时间】:2015-09-15 16:10:04
【问题描述】:
我正在 mongo 中尝试使用 map-reduce,但遇到了一个让我完全难过的数值问题。给定以下 map 和 reduce 函数:
var map = function(){
key = "awesome";
emit(key, {count: 1})
}
var reduce = function(key, values){
var result = {count: 0};
values.forEach(function(value) {
result.count += value.count;
});
result.countBy2 = result.count/2
// result.count = result.count/2
return result
}
给出逻辑
"results" : [
{
"_id" : "awesome",
"value" : {
"value" : {
"count" : 7696.0000000000000000,
"countBy2" : 3848.0000000000000000
}
},
在顶部代码 sn-p 中取消注释行会给出非常奇怪的输出
"results" : [
{
"_id" : "awesome",
"value" : {
"count" : 98.0000000000000000,
"countBy2" : 98.0000000000000000
}
},
为什么?
反转注释行以保持 map 和 reduce 命令的对象格式相同(关联?)。 .
// result.countBy2 = result.count/2
result.count = result.count/2
仍然给出意外的输出
"results" : [
{
"_id" : "awesome",
"value" : {
"count" : 98.0000000000000000
}
}
我错过了什么?
【问题讨论】:
-
你是如何调用函数的?
-
'db.stuff.mapReduce(map, reduce, { out: { inline: 1 }, scope: { all:tot }, });'
-
“映射器”是问题所在。映射器的“输出”与reducer 作为“输出”本身发出的不同。这是最常见的 mapReduce 错误,因此可能是您的问题。如果您不明白,请显示您的所有代码。
-
那一行会使你的reduce函数不是幂等的。在此处查看 reduce 函数限制:docs.mongodb.org/manual/reference/command/mapReduce/…
-
与"idempotent" 无关,这与这里的问题完全不同,但至少链接基本正确。或者更具体地说:Requirements of the reudce function,这样您就不需要自己滚动浏览了。
标签: javascript mongodb mapreduce