Couchdb降低收缩率检查否认了视图

时间:2012-11-05 13:58:31

标签: mapreduce couchdb

我知道这已经被讨论了很多次,但我认为我的情景会因禁用价格限制而大喊:

文档的格式为:

{ 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解决方案的想法,而不改变这些文档的结构。感谢。

1 个答案:

答案 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;
}