2012-11-26 3 views
0

J'ai créé le suivant Réduire la carte et suis tombé sur quelque chose de curieux. Je compte de deux façons différentes le nombre de documents par date et en proposant différentes valeurs. Voici mes fonctions:Couting lignes dans MapReduce dans MongoDB

map : function Map() { 
    emit(
     this.cDate,//Holds a date value 
     { 
     count: 1, 
     } 
    ); 
} 

reduce : function Reduce(key, values) { 
    var reduced = {count:0,count1:0}; 
    values.forEach(function(val) { 
     reduced.count += val.count; 
     reduced.count1++; 
    }); 

return reduced; 
} 

finalize : function Finalize(key, reduced) { 
    return reduced; 
} 

query : { "cDate" : { "$gte" : ISODate("2012-11-20T00:00:00Z") } } 

out : { inline : 1 } 

donc en gros ce qui est étrange est que, à la fin « compte » et « count1 » retournent des valeurs différentes. "count" a la valeur correcte, c'est-à-dire le nombre de documents pour cette date tandis que "count1" a une valeur beaucoup plus faible. Quelqu'un peut-il expliquer (je suis nouveau à MongoDB donc utiliser des termes simples :-) Merci.

Répondre

1

Deux problèmes (qui sont vraiment le même problème):

  • Votre format emit doivent être le même que votre résultat retourné dans la fonction emit. Votre réduction doit être prête à être appelée plus d'une fois pour la même touche (si vous réduisez cinq valeurs pour une clé puis réduisez trois valeurs pour une clé, la fonction de réduction peut être appelée à nouveau pour réduire le résultat de deux opérations réduire précédentes.

Votre exemple montre simplement ce qui se passe si vous supposez que vous serez toujours réduirez le résultat « 1 » plutôt que le résultat réel précédemment émis ou réduite.

Référence : http://www.mongodb.org/display/DOCS/MapReduce#MapReduce-ReduceFunction

+0

Salut 1. Même si j'ajoute Count1 à l'émission, j'obtiens le même résultat 2. wouldnt "count1" être le même ou plus grand que "count" si réduire a été appelé plusieurs fois? – adinas

+0

non, vous incrémentez count1 de 1 au lieu de by en passé count - ce que vous supposez sera toujours 1, et ce n'est pas le cas. –

+0

OK, donc vous dites que même si j'ai défini "count: 1" dans emit, je n'obtiendrai pas toujours 1 dans la réduction car il peut être une réduction sur une réduction. Oui? – adinas

Questions connexes