2017-08-24 74 views
0

我有一个返回这样的结果的地图功能:couchbase减少给人不想要的结果

{"total_rows":100995,"rows":[ 
{"id":"00001_372792","key":["00001","CADENCIER",0],"value":-0.1961035657664066}, 
{"id":"00001_372792","key":["00001","CADENCIER",0],"value":-0.1961035657664066}, 
{"id":"00001_386302","key":["00001","CADENCIER",0],"value":0.6934708647727543}, 
{"id":"00001_386302","key":["00001","CADENCIER",0],"value":0.6934708647727543}, 
{"id":"00001_386963","key":["00001","CADENCIER",0],"value":0.6922628824612621}, 
{"id":"00001_386963","key":["00001","CADENCIER",0],"value":0.6922628824612621}, 
{"id":"00001_387089","key":["00001","CADENCIER",0],"value":0.6919048724571887}, 
{"id":"00001_387089","key":["00001","CADENCIER",0],"value":0.6919048724571887}, 
{"id":"00001_387091","key":["00001","CADENCIER",0],"value":0.6919048724571887}, 
{"id":"00001_387091","key":["00001","CADENCIER",0],"value":0.6919048724571887}, 
{"id":"00001_387099","key":["00001","CADENCIER",0],"value":0.6921140124188077}, 
{"id":"00001_387099","key":["00001","CADENCIER",0],"value":0.6921140124188077}, 
{"id":"00001_387105","key":["00001","CADENCIER",0],"value":0.6921140124188077}, 
{"id":"00001_387105","key":["00001","CADENCIER",0],"value":0.6921140124188077}, 
{"id":"00001_387193","key":["00001","CADENCIER",0],"value":0.6936603115840247}, 
{"id":"00001_387193","key":["00001","CADENCIER",0],"value":0.6936603115840247}, 
{"id":"00001_387848","key":["00001","CADENCIER",1],"value":-0.29332158594360835}, 
{"id":"00001_387848","key":["00001","CADENCIER",1],"value":-0.29332158594360835}, 
{"id":"00001_388313","key":["00001","CADENCIER",1],"value":-0.0461553701861542}, 
{"id":"00001_388313","key":["00001","CADENCIER",1],"value":-0.0461553701861542}, 
{"id":"00001_388806","key":["00001","CADENCIER",1],"value":-0.04833054041013961}, 
{"id":"00001_388806","key":["00001","CADENCIER",1],"value":-0.04833054041013961}, 
{"id":"00001_388897","key":["00001","CADENCIER",1],"value":-0.25761199232338083}, 
{"id":"00001_388897","key":["00001","CADENCIER",1],"value":-0.25761199232338083}, 
{"id":"00001_435016","key":["00001","CADENCIER",1],"value":-0.037149057843773745}, 
{"id":"00001_435016","key":["00001","CADENCIER",1],"value":-0.037149057843773745} 
... 
]} 

我想关键,以减少集团和返回每个键的值的数量,以及其他一些计算值。

我这样做:

function (key, values, rereduce) { 

    var result = {}; 
    var ecartsSum; 
    for(var i = 0; i < values.length; i++) { 
    ecartsSum =+ values[i]; 
    } 
    result.productsNumber = values.length; 
    result.index = 100 + (Math.tan(ecartsSum/values.length)) * 100 
    return result; 
} 

当我请求使用该密钥["00001","CADENCIER",0]

我得到这个结果的看法:

{ 
    "productsNumber": 3, 
    "index": null 
} 

这是不是我所期待的所有结果。

PS:我使用这些选项来选择: connection_timeout = 6亿& full_set =真&组=真& inclusive_end =真&键=%5B%2200001%22%22CADENCIER%22,0%5D &极限= 6 & reduce = true & skip = 0 & stale = false

回答

1

并非给定键的所有值都一次传递给reduce函数。 MapReduce视图将在数据的子集上工作,减少每个子集并使用相同的reduce函数将它们组合,直到处理完所有值。

您需要使用rereduce参数,以便该函数可以减少以前对自身调用的输出。

Re-reduce Argument文档:

为了处理增量映射/降低的功能(即更新现有的视图),每个函数还必须能够处理和消耗的功能的自己的输出。这是因为在增量情况下,函数必须处理新记录和以前计算的减少量。

尝试像从documentation这个例子:

function(key, values, rereduce) { 
    var result = {total: 0, count: 0}; 
    for(i=0; i < values.length; i++) { 
    if(rereduce) { 
     result.total = result.total + values[i].total; 
     result.count = result.count + values[i].count; 
    } else { 
     result.total = sum(values); 
     result.count = values.length; 
    } 
    } 
    return(result); 
}