जैसा कि टिप्पणियों में बताया गया है, आप इस उद्देश्य के लिए मानचित्र/कमी का उपयोग कर सकते हैं। तो आप अपने मॉडल में निम्नलिखित विधि को परिभाषित कर सकते हैं ( 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 में समर्पित समूह विधि भी है लेकिन मुझे यकीन नहीं है कि Mongoid 3 में नंगे mongodb संग्रह कैसे प्राप्त करें। मुझे अभी तक कोड में गोता लगाने का मौका नहीं मिला है।
आपको आश्चर्य हो सकता है कि मैं एक दस्तावेज़ क्यों छोड़ता हूँ {count: 1}
क्योंकि इससे कोई फर्क नहीं पड़ता और मैं खाली दस्तावेज़ या कुछ भी उत्सर्जित कर सकता था और फिर परिणाम में हमेशा 1 जोड़ सकता था। प्रत्येक मूल्य के लिए गिनती। बात यह है कि कम नहीं कहा जाता है यदि विशेष कुंजी के लिए केवल एक उत्सर्जन किया गया है (मेरे उदाहरण में course_id
केवल एक बार खेला गया है) इसलिए परिणाम के रूप में उसी प्रारूप में दस्तावेज़ों का उत्सर्जन करना बेहतर है।