2010-10-04 6 views
3

J'ai une collection où chaque document ressemble à ceMongoDB - comment je tourne ce groupe() requête map/reduce

{access_key:'xxxxxxxxx', keyword: "banana", count:12, request_hour:"Thu Sep 30 2010 12:00:00 GMT+0000 (UTC)"} 
{access_key:'yyyyyyyyy', keyword: "apple", count:25, request_hour:"Thu Sep 30 2010 12:00:00 GMT+0000 (UTC)", } 
..... 

Pour y parvenir:

SELECT keyword, sum(count) FROM keywords_counter WHERE access_key = 'xxxxxxxxx' GROUP BY keyword

Je suis Pour ce faire:

db.keywords_counter.group({key  : {keyword:true}, 
          cond : {access_key: "xxxxx"}, 
          reduce : function(obj, prev){prev.total += obj.count}, 
          initial : {total:0}}) 

Comment puis-je obtenir la même chose avec map/reduce? [Je suis une map/reduce débutant et essayer d'envelopper ma tête autour du concept.]

Répondre

3

trouvé la solution:

map = function(){ emit(this.keyword, {count: this.count}); } 

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

db.keywords_counter.mapReduce(map, reduce, {query:{access_key: 'xxxxxxxxx'}}) 
+0

grâce, il a beaucoup aidé. Mais je travaille encore dessus, parce que j'obtiens un compte de 0. – theTuxRacer

+0

@thetuxracer - vérifie si le 2ème paramètre à émettre est identique à l'objet retourné par reduce. Cela a fonctionné pour moi. – rubayeet

+0

je l'ai eu, j'ajoutais incorrectement le compte, je ddnt employez le tableau de valeur. mais ton commentaire m'a aidé à clarifier une autre requête: D – theTuxRacer