2010-09-21 13 views
2

Si le message suivant est utiliséLe tri Map/Reduce de MongoDB fonctionne-t-il?

Analytic.collection.map_reduce(map, reduce, 
    :query => {:page => subclass_name}, 
    :sort => [[:pageviews, Mongo::DESCENDING]]).find.to_a 

il ne sera pas trier par pageviews. Sinon, s'il s'agit d'un tableau de hachage:

Analytic.collection.map_reduce(map, reduce, 
    :query => {:page => subclass_name}, 
    :sort => [{:pageviews => Mongo::DESCENDING}]).find.to_a 

cela ne fonctionnera pas non plus. Je pense que la raison pour laquelle il doit s'agir d'un tableau est de spécifier le premier champ à trier, etc. J'ai également essayé un tableau plat au lieu d'un tableau comme dans le premier code listé ci-dessus et cela n'a pas fonctionné non plus .

Ça ne marche pas? Ceci est la spécification: http://api.mongodb.org/ruby/current/Mongo/Collection.html#map_reduce-instance_method

Répondre

5

Qu'est-ce que vous essayez de faire? Le tri n'est vraiment utile qu'en conjonction avec la limite: il est appliqué avant la carte pour que vous puissiez juste MapReduire les 20 derniers éléments ou quelque chose. Si vous essayez de trier les résultats, vous pouvez simplement effectuer un tri normal sur la collection de sortie.

+0

je vois. peut-être que la spécification peut mentionner que c'est avant la carte, pas pour les résultats finaux. aussi, pourquoi avons-nous besoin de trier quelque chose pour la carte/réduire? Dans les cas où je vois l'utilisation de map/reduce, peu importe l'ordre dans lequel les documents (enregistrements) se trouvent. –

+0

Il s'agit de l'agrégation d'un sous-ensemble de vos données. Supposons que vous vouliez effectuer une agrégation sur les 500 dernières visites sur votre site. Vous pouvez faire un MapReduce sur votre collection de visiteurs avec un tri par date et une limite de 500. Sans tri, vous ne pourriez pas vraiment faire cela. – kristina

3

Ok, il est un peu délicat:

Après la map_reduce(), un objet Mongo::Collection est retourné, mais la structure est comme:

[{"_id":123.0,"value":{"pageviews":3621.0,"timeOnPage":206024.0}}, 
{"_id":1320.0,"value":{"pageviews":6584.0,"timeOnPage":373195.0}}, 
    ... 
] 

donc à faire le tri, il doit être :

Analytic.collection.map_reduce(map, reduce, 
    :query => {:page => subclass_name}).find({}, 
    :sort => [['value.pageviews', Mongo::DESCENDING]]) 

noter la partie value.pageviews.

+0

Est-ce vrai? La documentation semble indiquer que le tri est appliqué à la collection que vous mappez avant que le mappeur ne commence. Je ne vois pas un moyen de trier les résultats, mais je suis très curieux de savoir si cela peut être fait. –