我正在尝试使用 Map Reduce 根据每个日期的字段值之一来计算文档数量。首先,这是几个常规 find() 函数的结果:
db.errors.find({ "cDate" : ISODate("2012-11-20T00:00:00Z") }).count();
返回 579(即该日期有 579 个文档)
db.errors.find( { $and: [ { "cDate" : ISODate("2012-11-20T00:00:00Z") }, {"Type":"General"} ] } ).count()
返回 443(即该日期有 443 个文档,其中 Type="General")
以下是我的 MapReduce:
db.runCommand({ mapreduce: "errors",
map : function Map() {
emit(
this.cDate,//Holds a date value
{
count: 1,
countGeneral: 1,
Type: this.Type
}
);
},
reduce : function Reduce(key, values) {
var reduced = {count:0,countGeneral:0,Type:''};
values.forEach(function(val) {
reduced.count += val.count;
if (val.Type === 'General')
reduced.countGeneral += val.countGeneral;
});
return reduced;
},
finalize : function Finalize(key, reduced) {
return reduced;
},
query : { "cDate" : { "$gte" : ISODate("2012-11-20T00:00:00Z") } },
out : { inline : 1 }
});
对于日期 20-11-20,map reduce 返回:
count: 579
countGeneral: 60 (should be 443 according to the above find query)
现在,我知道 Reduce 的循环方式是不可预测的,那么我应该怎么做呢?谢谢