2010-01-24 7 views
4

J'essaie de ramener une liste de combinaisons année/mois avec des comptes pour décrire les articles de blog. L'idée est qu'ils seront affichés comme ceci:Groupe MongoDB utilisant le pilote Ruby

  • Janvier 2010 (1 poste)
  • décembre 2009 (2 messages)
  • ...

J'ai réussi à obtenir ce de travailler en utilisant le shell MongoDB JS, et il renvoie les résultats dans un format utile:

db.posts.group({ 
    keyf: function(x){ 
         return { 
           month: x.datetime.getMonth(), 
           year:x.datetime.getFullYear() 
         }; 
    }, 
    reduce: function(x,y){ y.count++ }, 
    initial:{count:0} 
}) 

résultats:

[ { "month" : 0, "year" : 2010, "count" : 3 }, 
    { "month" : 0, "year" : 1970, "count" : 1 } ] 

C'est génial, exactement ce que je suis après. Cependant, en essayant de convertir cela en code approprié pour le pilote ruby, je ne peux pas le faire fonctionner. Je l'ai regardé la documentation et de ma compréhension, ce qui suit devrait donner les mêmes résultats (j'utilise MongoMapper, d'où le Post.collection):

@archive = Post.collection.group(
    "function(x) { return { month: x.datetime.getMonth(), year:x.datetime.getFullYear() }; }", 
    nil, { :count => 0 }, 'function(x,y){y.count++}', true) 

Au lieu de redonner le bon choix de données utiles, je m obtenir ce gâchis: (! et ma compréhension du code source)

{ 
    "function(x) { return { month: x.datetime.getMonth(), year:x.datetime.getFullYear() }; }" => nil, 
    "count" => 4.0 
} 

il semble que ce soit il est complètement en train de défier sa propre documentation ou je manque quelque chose de fondamental ici. J'arrache presque mes cheveux, toute aide est acceptée avec reconnaissance.

Répondre

2

C'est un comportement assez étrange. Je viens de lancer votre code localement, et tout a fonctionné. Pouvez-vous vérifier que vous utilisez la version du pilote 0.18.2? Si c'est le cas, assurez-vous que c'est la seule version installée (juste comme une vérification de santé mentale).

Je ne pense pas que cela devrait faire la différence, mais je n'utilisais pas #group de MongoMapper - j'utilisais la gemme seule. Vous pourriez essayer cela aussi. Voici le code que j'ai exécuté:

require 'rubygems' 
require 'mongo' 

d = Mongo::Connection.new.db('blog') 
c = d['post'] 

p c.group("function(x) { return { month: x.date.getMonth(), year:x.date.getFullYear() }; }", 
    nil, 
    { :count => 0 }, 
    "function(x,y){y.count++}", 
    true) 
+0

J'ai vérifié les versions et j'ai installé 0.18 et 0.18.2. J'ai enlevé l'ancienne version et mis à jour MongoMapper (la version que j'avais dépendait de 0.18). Le problème persiste toujours. J'ai également essayé d'utiliser le pilote comme vous l'avez fait et dans mon cas, il échoue toujours. Je ne comprends pas pourquoi ça agirait différemment pour toi que pour moi? EDIT: en essayant cela dans son propre script, vous obtenez le bon résultat. Il semble seulement échouer à partir de l'application de mes rails. –

+0

Hmm. Je ne sais pas quel effet Rails pourrait avoir sur ça. Je pense que la meilleure chose serait pour vous de créer un cas de test complet échouant pour moi et John (de MongoMapper). –

+0

Oh, j'ai été un pilier monumental. Il s'avère que c'était la différence de version 0.18 à 0.18.2. J'ai juste oublié de redémarrer le serveur de dev après avoir enlevé le vieux gem et tout mis à jour. En revenant et en regardant la source 0.18 sur github, je vois qu'entre 0.18.2 et 0.28.2, le support du code keyf a été ajouté et cela l'a corrigé. Je me sens bien idiot :) –

Questions connexes