コメントで述べたように、この目的のためにmap/reduceを使用できます。したがって、モデルで次のメソッドを定義できます(http://mongoid.org/en/mongoid/docs/querying.html#map_reduce)
def self.today
map = %Q{
function() {
emit(this.course_id, {count: 1})
}
}
reduce = %Q{
function(key, values) {
var result = {count: 0};
values.forEach(function(value) {
result.count += value.count;
});
return result;
}
}
self.where(:created_at.gt => Date.today, status: "played").
map_reduce(map, reduce).out(inline: true)
end
その結果、次の結果になります:
[{"_id"=>1.0, "value"=>{"count"=>2.0}}, {"_id"=>2.0, "value"=>{"count"=>1.0}}]
ここで、_id
course_id
です およびcount
は再生回数です。
MongoDBには専用のグループメソッドもありますが、Mongoid3の裸のmongodbコレクションにアクセスする方法がわかりません。まだコードに飛び込む機会がありませんでした。
なぜ私がドキュメントを発行するのか不思議に思うかもしれません{count: 1}
それほど重要ではなく、空のドキュメントなどを発行して、すべての値のresult.countに常に1を追加することもできます。重要なのは、特定のキー(私の例ではcourse_id
)に対して1つのemitのみが実行された場合、reduceは呼び出されないということです。 一度だけ再生された)ので、結果として同じ形式でドキュメントを発行することをお勧めします。