1

我知道这已经讨论了很多次,但我认为我的场景是为了禁用速率限制检查:

文档格式为:

{ 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);})
        }

问题是收缩率不够好,因为显然我以不同的形状返回相同数量的数据:我将一个包含许多元素的列表转换为一个包含少量元素的列表,每个元素都有很多数据。

我知道我可以使用列表函数等解决它,但我认为该场景对于禁用检查是有效的。此外,如果它存在,我想要任何使用 map-reduce 解决方案而不改变这些文档结构的想法。谢谢。

4

1 回答 1

0

reduce 函数的主要任务是对 map 函数产生的结果进行归约。

由于您的 map 函数[prefix]作为值发出,[prefix]因此每个键都不同,并且您想减少/分组键,可能您也有兴趣不看到[prefix]每个组的重复项,对吗?

Next 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;
}
于 2012-11-06T01:13:59.957 回答