Mapreduce Couchdb减少收缩率检查拒绝该视图

Mapreduce Couchdb减少收缩率检查拒绝该视图,mapreduce,couchdb,Mapreduce,Couchdb,我知道这已经被讨论了很多次了,但我认为我的场景是为了禁用利率限制检查: 文件格式如下: { prefix: "004945", country: "Germany", type: "Mobile", carrier: "OrangeTel", price: "34"} { prefix: "004946", country: "Germany", type: "Mobile", carrier: "SomeOther", price: "46"} . . . { prefix: "00807",

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

文件格式如下:

{ 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([国家、类型、承运人],[前缀])
我这样做:

reduce: function(keys, values, rereduce) { 
           return values.reduce(function(a, b) {return a.concat(b);})
        }
问题是收缩率不够好,因为很明显,我以不同的形状返回相同数量的数据:我将一个包含许多元素的列表(每个元素都有少量数据)转换为包含少量元素的列表(每个元素都有大量数据)


我知道我可以用列表函数之类的方法来解决这个问题,但我认为这个场景对于禁用检查是有效的。此外,如果它存在,我希望任何想法,使用地图减少解决方案,而不改变这些文件的结构。谢谢。

reduce函数的主要任务是减少map函数产生的结果

由于map函数将
[prefix]
作为值发出,
[prefix]
对于每个键都是不同的,并且您希望减少/group键,可能您也有兴趣不看到每个组重复的
[prefix]
,对吗

下一个reduce函数从values数组生成一组值,并且应该为您的密钥生成唯一的
[前缀]
-es短列表,并且不会出现逃税率问题。如果您需要计算reduced key的前缀有多少不同,这将是另一个函数,但目标是相同的:reduce reduce和rereduce long list of value(:

函数(键、值、返回值){
var前缀=[];
var update_set=函数(src、dst){
用于(src中的变量idx){
项目=src[idx];
如果(dst.indexOf(项目)=-1){
dst.推送(项目);
}
}
返回dst;
}
如果(减少){
for(值中的变量idx){
更新_集(值[idx],前缀);
}
}
否则{
更新_集(值、前缀);
}
返回前缀;
}

我看不出你的reduce乐趣与我的有什么不同,除了它满足重复的事实。你不是通过连接传递的值来创建返回值吗?收缩率检查器测量输出的大小,因此你的reduce不会使事情变得更好,因为同一视图键的重复值非常复杂如果不存在,则非常罕见。如果需要,您可以将值串联起来,而不是将它们单独存储在数组中,但不会,此变体不会因收缩率而失败,因为返回的值将至少等于初始值列表,而不是更大的值。但是,您可以通过查看[源代码]来证明这一点[-请注意,结果不应至少比初始值长两倍。因为
N
是所有
项,
M
是唯一的
项,M My[国家、类型、承运人]视图键大约为40.000。其中只有3个重复的前缀。无论如何,我检查了你的函数,它返回了相同的收缩率错误…我认为结果最多应该是输入大小的一半,而不是相反…我将查看代码。嗯…我在发布之前用你的示例数据对其进行了测试,所以我想知道它失败的原因。可以吗您将问题数据的样本上传到某个地方(例如Iriscoch)让我来玩玩它。还有一个有趣的方法和原因……我发现了原因:在您上面提到的源代码中,当2*reduced length>input length时,它会抛出错误。因此,本质上我应该至少将每个reduce的输出减半,以避免抛出收缩率错误。