यहां एक आसान MapReduce दिया गया है। वह वही करेगा जो आप चाहते हैं:
map = function() {
for (var key in this.values){
emit(key, {count:1, trues: (this.values[key] ? 1 : 0)});
}
}
reduce = function(key, values){
var out = values[0];
for (var i=1; i < values.length; i++){
out.count += values[i].count;
out.trues += values[i].trues;
}
return out;
}
finalize = function(key, value){
value.ratio = value.trues / value.count;
return value;
}
db.runCommand({mapReduce:'collection',
map:map,
reduce:reduce,
finalize:finalize,
out:'counts'
})
db.counts.findOne({_id:'alpha'})
{_id: 'alpha', value: {count: 100, trues: 52, ratio: 0.52}}
आप एक अपसर्ट भी कर सकते हैं। इस तरह जब आप अपने मुख्य संग्रह में सम्मिलित करते हैं जो आपको अपने डेटा में एक रीयल-टाइम दृश्य देगा:
for (var key in this.values){
db.counts.update({_id:key},
{$inc:{count:1, trues: (this.values[key] ? 1 : 0)}},
true);
}
वास्तव में, आप इन विधियों को जोड़ भी सकते हैं। गणना संग्रह को पॉप्युलेट करने के लिए एक बार का MapReduce बैच कार्य करें और फिर इसे अप टू डेट रखने के लिए अप्सर्ट का उपयोग करें।