2013-04-14 4 views
1

J'ai besoin d'aide pour trier un groupe mongo par 'query in ruby.Tri d'un groupe mongo par requête dans Ruby

J'ai un groupe qui travaille. La requête ci-dessous les enregistrements de groupes à l'heure, les résultats retourner quelque chose comme ceci:

{"date"=>"2013,4,2,18,0,0,0", "count"=>1.0} 
{"date"=>"2013,4,9,19,0,0,0", "count"=>1.0} 
{"date"=>"2013,3,13,2,0,0,0", "count"=>3.0} 

Idéalement, les résultats seraient classés par le champ « date ».

data = db[collection_name].group(
"function(doc) { 
var dateKey = doc.created_at.getFullYear() + ',' + 
(doc.created_at.getMonth() + 1) + ',' + doc.created_at.getDate() + ',' + 
doc.created_at.getHours() + ',0,0,0'; 
return {'date': dateKey};}", 
{"parent_id" => parent_id, "checked" => true}, 
{ :count => 0 }, 
"function(doc, y){y.count++}", 
true) 
+0

À quoi le résultat devrait-il ressembler? –

+0

Les résultats sembleront les mêmes triés uniquement par date. Comme ceci: {"date" => "2013,3,13,2,0,0,0", "count" => 3.0} {"date" => "2013,4,2,18,0 , 0,0 "," count "=> 1,0} {" date "=>" 2013,4,9,19,0,0,0 "," count "=> 1,0} –

+0

Y a-t-il une raison pour cela? re utilisant groupe() au lieu du cadre d'agrégation? –

Répondre

0

Ruby a un haut-sort_by fonction pour enumberables (y compris les tableaux).

array = [ 
    {"date"=>"2013,4,2,18,0,0,0", "count"=>1.0}, 
    {"date"=>"2013,4,9,19,0,0,0", "count"=>1.0}, 
    {"date"=>"2013,3,13,2,0,0,0", "count"=>3.0} 
] 

p array.sort_by { |item| item['date'] } 

# => [ 
# {"date"=>"2013,3,13,2,0,0,0", "count"=>3.0}, 
# {"date"=>"2013,4,2,18,0,0,0", "count"=>1.0}, 
# {"date"=>"2013,4,9,19,0,0,0", "count"=>1.0} 
#] 

Modifier: Vous pouvez également analyser le temps d'un objet temporel dans le bloc pour assurer le tri correct.

require 'time' 

array = [ 
    {"date"=>"2013,4,2,18,0,0,0", "count"=>1.0}, 
    {"date"=>"2013,4,9,19,0,0,0", "count"=>1.0}, 
    {"date"=>"2013,3,13,2,0,0,0", "count"=>3.0}, 
    {"date"=>"2013,4,13,2,0,0,0", "count"=>2.0} 
] 

p array.sort_by { |item| Time.parse(item['date']) } 

# => [ 
# {"date"=>"2013,3,13,2,0,0,0", "count"=>3.0}, 
# {"date"=>"2013,4,2,18,0,0,0", "count"=>1.0}, 
# {"date"=>"2013,4,9,19,0,0,0", "count"=>1.0}, 
# {"date"=>"2013,4,13,2,0,0,0", "count"=>2.0} 
# ] 
+0

Droit - Je peux faire ce travail. Cependant les dates sont triées de manière alphanumérique - donc 2013,4,13 vient avant 2013,4,2. Ce que j'aimerais vraiment, c'est que la requête renvoie les résultats triés. –

+0

Vous pouvez analyser les temps. –

+1

Ceci est un bon substitut pour que la requête trie les résultats. Je peux faire ce travail. –