我在2.6 mongod实例上执行增量贴图缩减,直到最近,一切都运行良好和花花公子。
db.runCommand({ mapreduce: "timespanaggregations",
query: {
"start" : {
$gt: previousRun,
}
},
map : function Map() {
delete this.start;
delete this.end;
delete this._id;
var key = this.user,
value = this;
delete value.user;
emit(key, value);
},
reduce : function Reduce(user, aggregationData) {
var result = {};
aggregationData.forEach(function(timespan){
Object.keys(timespan).forEach(function(field){
if (!result[field] || (field.indexOf('Last', field.length - 5) != -1)) {
result[field] = timespan[field];
} else if ((field.indexOf('Count', field.length - 5) != -1) || (field.indexOf('Sum', field.length - 5) != -1)) {
result[field] += timespan[field];
} else if (field.indexOf('Min', field.length - 5) != -1) {
result[field] = (result[field] > timespan[field]) ? timespan[field] : result[field];
} else if (field.indexOf('Max', field.length - 5) != -1) {
result[field] = (result[field] < timespan[field]) ? timespan[field] : result[field];
}
});
});
return result;
},
sort : { "user" : 1, "start" : 1 },
out : { reduce: "lifetime_agg" },
jsMode: true
});
我很确定我没有违反任何要求,没有任何东西没有达到极限。但是,如果我不使用查询来使块足够小,则该命令根本不执行任何操作。它只是响应:
counts: {
input: 0,
emit: 0,
reduce: 0,
output: number of records already in lifetime_agg
}
我本来期望某种错误信息。如果我强制它以较小的查询结果运行,整个过程仍然有效。
jsMode
设置为true,因为我正在调整它并且记录数量远不及500,000。它的行为与jsMode
设置为false的行为相同。