我知道这已经被讨论了很多次,但我认为我的情景会因禁用价格限制而大喊:
文档的格式为:
{ prefix: "004945", country: "Germany", type: "Mobile", carrier: "OrangeTel", price: "34"}
{ prefix: "004946", country: "Germany", type: "Mobile", carrier: "SomeOther", price: "46"}
.
.
.
{ prefix: "00807", country: "Unknown", type: "Satelite", carrier: "Inmarsat", price: "123"}
现在我想获得一些[country, type, carrier]
密钥或[country, type]
密钥
所以我这样映射:
emit( [country, type, carrier],[prefix] )
我这样减少:
reduce: function(keys, values, rereduce) {
return values.reduce(function(a, b) {return a.concat(b);})
}
问题是收缩率不够好,因为很明显我以不同的形状返回相同数量的数据:我将包含许多元素的列表转换为少数几个元素的列表,每个元素都包含很多数据。
我知道我可以使用list函数等解决它,但我认为该场景对于禁用检查是有效的。此外,如果它存在,我想任何使用map-reduce解决方案的想法,而不改变这些文档的结构。感谢。
答案 0 :(得分:0)
reduce函数的主要任务是减少map函数产生的结果。
由于您的地图功能会将[prefix]
作为值发出,[prefix]
对于每个键都是不同的,并且您希望减少/分组键,可能您也有兴趣看不到[prefix]
重复项对于每个小组,对吧?
接下来,reduce函数从values数组生成一个集合,并且应该为您的密钥生成唯一且短的[prefix]
- es列表,并且它不会受到推卸率问题的影响。如果你需要计算减少键的不同前缀的数量,这将是另一个函数,但目标是相同的:reduce reduce和rereduce long list of values(:
function(keys, values, rereduce){
var prefixes = [];
var update_set = function(src, dst){
for (var idx in src){
item = src[idx];
if (dst.indexOf(item) == -1){
dst.push(item);
}
}
return dst;
}
if (rereduce){
for (var idx in values){
update_set(values[idx], prefixes);
}
}
else{
update_set(values, prefixes);
}
return prefixes;
}