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

Javascript 当值是reduce函数(CouchDB)中的对象时访问属性,javascript,couchdb,Javascript,Couchdb,我正在尝试用CouchDB编写一个查询,它将获得所有年龄最大的人的姓名和年龄,按性别和活动状态分组。仅搜索一个数据文档。作为理解当值是对象时如何编写reduce函数的中间步骤,我编写了一个查询,它只返回每个组中的最大年龄,但没有成功。下面的map和reduce函数返回相应的键,它们是4个阳性/阴性和真/假组合,但在所有四个组中,值始终返回0 为什么此视图不返回每个组的最大年龄 地图功能: function(doc){ for (var i in doc.data){ va

我正在尝试用CouchDB编写一个查询,它将获得所有年龄最大的人的姓名和年龄,按性别和活动状态分组。仅搜索一个数据文档。作为理解当值是对象时如何编写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;
}
减少功能:

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;
}
函数(键、值、返回值){
var-maxAge=0;
对于(变量i=0;i最大年龄){
最大年龄=值[i]。年龄;
}
}
返回最大值;
}

您没有涵盖
重新导出的案例。您的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(函数(a,b){
返回Math.max(a,b);
});
}
var-maxAge=0;
对于(变量i=0;i最大年龄){
最大年龄=值[i]。年龄;
}
}
返回最大值
}
通常,使用自定义reduce函数会导致性能相关的问题。如果可能的话,最好选择效率更高的内置减速器


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

您没有涉及
REREREREDUCE
案例。您的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(函数(a,b){
返回Math.max(a,b);
});
}
var-maxAge=0;
对于(变量i=0;i最大年龄){
最大年龄=值[i]。年龄;
}
}
返回最大值
}
通常,使用自定义reduce函数会导致性能相关的问题。如果可能的话,最好选择效率更高的内置减速器

此外,您还可以将
数据
数组拆分为单独的文档,以减少发生更新冲突的机会