2010-09-16 3 views
4

liés à MongoDB Group using Ruby driverComment utiliser MongoDB Ruby Driver pour faire un "Groupe" (groupe par)?

si je veux faire quelque chose comme ce qui suit dans SQL:

select page_id, count(page_id) from a_table group by page_id 

Je pensais que le doc MongoDB dit

http://api.mongodb.org/ruby/current/Mongo/Collection.html#group-instance_method

group(key, condition, initial, reduce, finalize = nil) 
# returns an array 

donc de l'autre poste, j'utilise:

Analytic.collection.group( "fucntion (x) return {page_id : x.page_id}", 
          nil, 
          {:count => 0}, 
          "function(x, y) { y.count++ }" ) 

mais il retourne en fait

[{"count"=>47.0}] 

qui est le nombre total d'enregistrements (documents) dans la collection. Est-ce que quelque chose de faux n'est pas correct? Je pensais que la clé est peut-être une chaîne statique comme dans

http://kylebanker.com/blog/2009/11/mongodb-count-group/

db.pageviews.group(
{ 
key: {'user.agent': true}, 
initial: {sum: 0}, 
reduce: function(doc, prev) { prev.sum += 1} 
}); 

mais ce n'est pas dans l'autre poste stackoverflow.

Mise à jour: En fait, dans le lien ci-dessus, la solution comme

Analytic.collection.group( ['page_id'], nil, 
    {:count => 0}, "function(x, y) { y.count++ }" ) 

œuvres, mais juste se demander pourquoi la première méthode dans ce poste ne fonctionnait pas.

Répondre

2

J'ai finalement eu à travailler par

Analytic.collection.group( ['myapp_id'], {:page => 'products'}, 
    {:pageviews => 0, :timeOnPage => 0}, 
    "function(x, y) { y.pageviews += x.pageviews; y.timeOnPage += x.timeOnPage }" ) 

mais j'utilisé Map/Reduce après que Map/Reduce semble être une méthode plus générique et puissant.

4

La raison pour laquelle le premier exemple n'a pas fonctionné est que vous avez mal orthographié "function" comme "fucntion". Ce qui suit devrait fonctionner:

Analytic.collection.group("function(x){ return {page_id : x.page_id}; }", 
          nil, 
          { :count => 0 }, 
          "function(x, y){ y.count++; }") 
+0

si je corrige l'orthographe, cette ligne renverra '[{" page_id "=> nil," count "=> 47.0}]' encore ... –

+0

Vous devriez vous assurer que vos données ont effectivement des valeurs pour page_id en plus néant. Ce résultat semble indiquer que tous les 47 documents ont un page_id de zéro. J'utilise la version 1.6.0 de mongodb et gem 1.0.7 et je ne peux pas dire avec certitude si oui ou non les versions précédentes de l'un ou l'autre pourraient produire des résultats différents. –