2017-08-24 5 views
0

J'ai une fonction de carte qui renvoie un résultat comme celui-ci:Couchbase Réduire les donne pas voulu résultat

{"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} 
... 
]} 

Je veux réduire au groupe par clé et retourner le nombre de valeurs de chaque clé, ainsi que d'autres calcul sur les valeurs.

Je l'ai fait:

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

Quand je demande l'affichage à l'aide de la touche ["00001","CADENCIER",0]

Je reçois ce résultat:

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

qui n'est pas du tout le résultat que je me attendais .

PS: J'utilise ces options pour sélectionner: connection_timeout = 600000000 & full_set = true & groupe = true & inclusive_end = true & key =% 5B% 2200001% 22% 22CADENCIER% 22,0% 5D = limite & 6 = true & réduire & skip = 0 & rassis = false

Répondre

1

toutes les valeurs pour une clé donnée sont passés à la diminution de la fonction à un moment donné. La vue MapReduce fonctionnera sur des sous-ensembles de données, en réduisant chaque sous-ensemble et en les combinant en utilisant la même fonction de réduction jusqu'à ce que toutes les valeurs aient été traitées.

Vous devez utiliser l'argument rereduce afin que la fonction puisse réduire la sortie des appels précédents vers elle-même.

De la documentation Re-reduce Argument:

Afin de gérer la carte incrémentale/réduire la fonctionnalité (à savoir la mise à jour d'une vue existante), chaque fonction doit également être capable de gérer et de consommer les fonctions propre sortie. En effet, dans une situation incrémentielle, la fonction doit gérer à la fois les nouveaux enregistrements et les réductions précédemment calculées.

Essayez quelque chose comme cet exemple de la 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); 
}