gpt4 book ai didi

javascript - MongoDB 中 reduce 函数中的奇怪数值错误

转载 作者:可可西里 更新时间:2023-11-01 10:27:20 24 4
gpt4 key购买 nike

我正在 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
}
},

顶部代码片段中的取消注释行给出了非常奇怪的输出

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

我错过了什么?

最佳答案

当您的reduce 函数包含将count 除以2 的行时,它违反了您必须遵守的reduce 函数的幂等要求,如docs 中所述。 :

the reduce function must be idempotent. Ensure that the following statement is true:

reduce( key, [ reduce(key, valuesArray) ] ) == reduce( key, valuesArray )

这基本上就是说,您需要能够将一个 reduce 调用的输出作为输入反馈给另一个调用,并使结果保持不变。

如果您想对 map-reduce 的输出执行最终处理,那么您可以包含一个 finalize在只会被调用一次的选项中运行。根据您最终要尝试做的事情,这可能是您应该将计数除以 2 的地方:

finalize: function(key, reducedValue) { return { count: reducedValue.count/2 }; }

关于javascript - MongoDB 中 reduce 函数中的奇怪数值错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32590807/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com