the*_*cer 4 javascript java mapreduce mongodb
我有一个M/R函数,我得到NaN作为一些结果的值.我没有任何JS经验.我使用Java驱动程序逃避JS.
String map = "function(){" + " emit({"
+ "country: this.info.location.country, "
+ "industry: this.info.industry}, {count : 1}); }";
String reduce = "function(key, values){var count = 0.0;"
+ "values.forEach(function(v){ count += v['count'];});"
+ "return count;}";
MapReduceOutput output = collection.mapReduce(map, reduce, null,
new BasicDBObject("lid", "foo"));
Run Code Online (Sandbox Code Playgroud)
一个例子有助于清除事物:
{"_id":{"country":"gb", "industry":"foo"}, "value":NaN}
Run Code Online (Sandbox Code Playgroud)
非常感谢.
我看到你已经解决了问题,但这就是问题发生的原因.
MongoDB可能会在之前的reduce传递结果上重新运行reduce函数.这称为重新减少.
如果在原始方案中发生重新缩减,则可能会得到如下值:
[
{ count: 1 },
{ count: 1 },
4
{ count: 1 },
{ count: 1 },
{ count: 1 },
3
{ count: 1 },
]
Run Code Online (Sandbox Code Playgroud)
所有{ count: 1 }值都由map函数发出.数字4和3以前减少调用的结果.然后,您的reduce函数将访问数字的count属性:
count += 4["count"];
Run Code Online (Sandbox Code Playgroud)
数字没有count属性,因此它将返回undefined.添加undefined到数字将导致NaN.
要避免这种难以调试的问题,您需要确保reduce函数是幂等的.完成此任务的最简单方法是返回您发出的内容 ; 您在reduce函数中返回的值应与您在map函数中发出的值具有相同的格式.