CouchDB在分组时减少错误?

时间:2014-01-28 11:04:38

标签: mapreduce couchdb

我有一个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;
}

0 个答案:

没有答案