【问题标题】:Access attributes when values are objects in reduce function (CouchDB)当值是reduce函数中的对象时访问属性(CouchDB)
【发布时间】:2017-11-29 19:12:36
【问题描述】:

我正在尝试在 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;
}

【问题讨论】:

    标签: javascript couchdb


    【解决方案1】:

    您没有涉及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
    }
    

    一般来说,使用自定义 reduce 函数可能会导致与性能相关的问题。如果可能的话,更喜欢效率更高的内置 reducer。

    此外,将data 数组拆分为单独的文档可能会为您提供更好的服务,以减少发生更新冲突的机会。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-08-25
      • 2020-02-25
      • 1970-01-01
      • 2013-12-02
      • 1970-01-01
      相关资源
      最近更新 更多