我有一个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"));
一个例子有助于清除事物:
{"_id":{"country":"gb", "industry":"foo"}, "value":NaN}
非常感谢.
我看到你已经解决了问题,但这就是问题发生的原因.
MongoDB可能会在之前的reduce传递结果上重新运行reduce函数.这称为重新减少.
如果在原始方案中发生重新缩减,则可能会得到如下值:
[ { count: 1 }, { count: 1 }, 4 { count: 1 }, { count: 1 }, { count: 1 }, 3 { count: 1 }, ]
所有{ count: 1 }
值都由map函数发出.数字4
和3
以前减少调用的结果.然后,您的reduce函数将访问数字的count
属性:
count += 4["count"];
数字没有count
属性,因此它将返回undefined
.添加undefined
到数字将导致NaN
.
要避免这种难以调试的问题,您需要确保reduce函数是幂等的.完成此任务的最简单方法是返回您发出的内容 ; 您在reduce函数中返回的值应与您在map函数中发出的值具有相同的格式.