我有一个map reduce查询,它将从多个文档中提取的值聚合到一个聚合文档中,该聚合文档映射到客户端应用程序的对象结构。
输出上的我的键是一个带有数据集标识符和数据集国家/地区段的2元素数组。
当我在'exact'分组上运行reduce时,这可以正常工作。
问题:只要我按数据集标识符汇总数据,即。我使用组级别1,一些值不正确,大多数不正确的值加倍,但其中一些有其他值。是否有任何已知问题,或者这是我的代码的错误?
运行我的地图查询后,我有一组看起来像这样的值:
{ [type]:
{ date:
{ [metric]: [value],
[more metric value combinations]
}
}
}
我有几个文档并运行一个应该加入它们的reduce,以便我得到以下结构:
{ type1:
{ date:
{ [metric]: [value],
[more metric value combinations]
},
anotherdate:
{ [metric]: [value],
[more metric value combinations]
},
},
type2:
{ date:
{ [metric]: [value],
[more metric value combinations]
}
},
}
为实现此目的,我使用以下reduce查询:
function (keys, values) {
//return values[0];
var returndoc = values[0];
for (var i = 1; i < values.length; i++) {
//Merge the current and previous object
returndoc = MergeDocs(returndoc, values[i]);
}
return returndoc;
}
function MergeDocs(doc1, doc2) {
var types = ['Live', 'Benchmark'];
for (var i = 0; i < types.length; i++) {
var t = types[i];
// if the source document does not Benchmark or Live column,
// create it and add values from the other document.
if (!doc1[t] && doc2[t]) {
doc1[t] = doc2[t];
}
// if the source document has a value and the other
// document exists, sum values.
else if (doc1[t] && doc2[t]) {
doc1[t] = MergeReports(doc1[t], doc2[t]);
}
}
return doc1;
}
function MergeReports(report1, report2) {
// iterate over the dates in the report in the report
for (var date in report2) {
// if there is no value for
if (!report1[date]) {
report1[date] = report2[date];
} else {
for (var metric in report2[date]) {
if (!report1[date][metric]) {
report1[date][metric] = report2[date][metric];
} else {
report1[date][metric] =
report1[date][metric] + report2[date][metric];
}
}
}
}
return report1;
}