Seperti yang disebutkan dalam komentar, Anda dapat menggunakan peta/pengurangan untuk tujuan ini. Jadi Anda dapat menentukan metode berikut dalam model Anda ( 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
yang akan menghasilkan hasil berikut:
[{"_id"=>1.0, "value"=>{"count"=>2.0}}, {"_id"=>2.0, "value"=>{"count"=>1.0}}]
dimana _id
adalah course_id
dan count
adalah jumlah pemutaran.
Ada juga metode grup khusus di MongoDB tetapi saya tidak yakin bagaimana cara mendapatkan koleksi mongodb kosong di Mongoid 3. Saya belum memiliki kesempatan untuk menyelami kode sebanyak itu.
Anda mungkin bertanya-tanya mengapa saya mengeluarkan dokumen {count: 1}
karena itu tidak terlalu penting dan saya bisa saja mengeluarkan dokumen kosong atau apa pun dan kemudian selalu menambahkan 1 ke result.count untuk setiap nilai. Masalahnya adalah pengurangan tidak dipanggil jika hanya satu emisi yang dilakukan untuk kunci tertentu (dalam contoh saya course_id
telah dimainkan hanya sekali) jadi lebih baik untuk mengeluarkan dokumen dalam format yang sama sebagai hasilnya.