当值是reduce函数中的对象时访问属性(CouchDB)

时间:2017-11-29 04:53:00

标签: javascript couchdb

我试图在CouchDB中编写一个查询,该查询将获得所有年龄最大的人的姓名和年龄,按性别和isActive状态进行分组。只搜索了一个数据文档。作为理解如何在值为对象时编写reduce函数的中间步骤,我编写了一个只返回每个组中最大年龄的查询,但这是不成功的。以下map和reduce函数返回相应的键,这些键是男性/女性和真/假的4种组合,但值总是在所有四个组中返回0。

为什么此视图不会返回每个组的最大年龄?

地图功能:

function(doc){
    for (var i in doc.data){
        var person = doc.data[i];
        emit([person.gender, person.isActive], {'age':person.age, 'name': person.name});
    }
}

减少功能:

function(keys, values, rereduce){
    var maxAge = 0;
    for (var i = 0; i < values.length; i++){
        if(values[i].age > maxAge){
            maxAge = values[i].age;
        }
    }
    return maxAge;
}

1 个答案:

答案 0 :(得分:2)

您没有涉及rereduce案例。您的reducer需要处理map函数发出的值,以及它自己返回的值:

function(keys, values, rereduce){
    if (rereduce) {
      return values.reduce(function(a, b) {
        return Math.max(a, b);
      });
    }
    var maxAge = 0;
    for (var i = 0; i < values.length; i++){
        if(values[i].age > maxAge){
            maxAge = values[i].age;
        }
    }
    return maxAge
}

通常,使用自定义缩减功能可能会导致与性能相关的问题。如果可能的话,更喜欢效率更高的内置减速器。

此外,您可以将data数组拆分为单独的文档,以减少更新冲突的可能性。