Đây là MapReduce đơn giản điều đó sẽ làm những gì bạn muốn:
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}}
Bạn cũng có thể thực hiện nâng cấp như thế này khi bạn chèn vào bộ sưu tập chính của mình, bộ sưu tập này sẽ cung cấp cho bạn chế độ xem theo thời gian thực vào dữ liệu của bạn:
for (var key in this.values){
db.counts.update({_id:key},
{$inc:{count:1, trues: (this.values[key] ? 1 : 0)}},
true);
}
Trên thực tế, bạn thậm chí có thể kết hợp các phương pháp này. Thực hiện công việc hàng loạt MapReduce một lần để điền vào bộ sưu tập số lượng và sau đó sử dụng các cảnh báo để giữ cho nó được cập nhật.