View 使用CouchDB和PockDB显示计算数据

View 使用CouchDB和PockDB显示计算数据,view,couchdb,pouchdb,View,Couchdb,Pouchdb,我试图理解如何使用CouchDB和PockDB返回文档上的计算数据。 假设我的CouchDB上有两种类型的文档:块和报告 报告包括:报告id、块id和日期 块包括:块id和名称 我想计算每个块的最后一个报告id,即最近一个报告的id,并将其与块的文档一起返回 有没有办法做到这一点? 我假设某种类型的视图会起作用,但我无法理解 您可以使用CouchDB中的map/reduce函数来实现这一点 假设您拥有这些文档: { "_id": "report_1", "type": "report",

我试图理解如何使用CouchDB和PockDB返回文档上的计算数据。 假设我的CouchDB上有两种类型的文档:块和报告

报告包括:报告id、块id和日期

块包括:块id和名称

我想计算每个块的最后一个报告id,即最近一个报告的id,并将其与块的文档一起返回

有没有办法做到这一点?
我假设某种类型的视图会起作用,但我无法理解

您可以使用CouchDB中的map/reduce函数来实现这一点

假设您拥有这些文档:

{
  "_id": "report_1",
  "type": "report",
  "block_id": "block_1",
  "date": "1500325245"
}



{
  "_id": "report_2",
  "type": "report",
  "block_id": "block_1",
  "date": "1153170045"
}
在本例中,您希望获得具有最高时间戳的报告repot_1

我们首先创建一个映射函数,该函数将映射文档,其中bloc_id作为键,timestamp+report id作为reduce函数的值

地图:

然后,我们将创建一个reduce函数。当rereduce为false时,我们只返回值。当rereduce为true时,我们将找到最大时间戳并返回与其关联的报告id

减少功能:

function (keys, values, rereduce) {
    if (rereduce) {
        var max = 0;
        var maxReportId = -1;
        for (var i = 0; i < values.length; i++) {
            var val = values[i][0];
            if (parseInt(val.date) > max) {
                max = val.date;
                maxReportId = val.report;
            }
        }
        //We return the report id of the most recent report.
        return maxReportId;
    } else
        return values;
}
function (keys, values, rereduce) {
    if (rereduce) {
        var max = 0;
        var maxReportId = -1;
        for (var i = 0; i < values.length; i++) {
            var val = values[i][0];
            if (parseInt(val.date) > max) {
                max = val.date;
                maxReportId = val.report;
            }
        }
        //We return the report id of the most recent report.
        return maxReportId;
    } else
        return values;
}