メモです。
RailsでMongoidを試していろいろやっているのですが、SQLでGROUPとか使う系の処理は、Mongoidに備わっているgroupメソッドよりもmap_reduceメソッドの方が良さそうなのでした。
map_reduce method in Class: Mongo::Collection
http://api.mongodb.org/ruby/current/Mongo/Collection.html#map_reduce-instance_method
例えばPointというコレクションがあって、ユーザーごとのポイントを集計してソートしたいという場合、以下のようなコードで集計&ソートできました。
m =<<-EOT
function(){
emit(this.user_id, {
point: this.point
});
}
EOT
r =<<-EOT
function(key, values){
var sum = 0;
values.forEach(function(value){
sum += value.point;
});
return {
point: sum
};
}
EOT
Point.collection.map_reduce(m,r).find.sort('value.point', :desc)
function(){
emit(this.user_id, {
point: this.point
});
}
EOT
r =<<-EOT
function(key, values){
var sum = 0;
values.forEach(function(value){
sum += value.point;
});
return {
point: sum
};
}
EOT
Point.collection.map_reduce(m,r).find.sort('value.point', :desc)
慣れればもっと複雑なことができるんだろうけど、mongodb自体よくわかってないので・・。
ここを参考にしました:
MongoDB, Mongoid and Map/Reduce
http://nsaunders.wordpress.com/2010/08/09/mongodb-mongoid-and-mapreduce/