View 排序降序时CouchDB空值

View 排序降序时CouchDB空值,view,mapreduce,couchdb,View,Mapreduce,Couchdb,我有CouchDB视图,它按自然顺序给我一个正确的值,降序时给我一个空值,下面是Futon的屏幕截图: 以下是查看代码: "informe_precios": { "map": "function(doc){if(doc.doc_type=='precio'){emit([doc.comprador,doc.fecha.substr(0,4),doc.fecha.substr(5,2)],{precio:doc.precio,litros:doc.litros});}}

我有CouchDB视图,它按自然顺序给我一个正确的值,降序时给我一个空值,下面是Futon的屏幕截图:

以下是查看代码:

"informe_precios": {
           "map": "function(doc){if(doc.doc_type=='precio'){emit([doc.comprador,doc.fecha.substr(0,4),doc.fecha.substr(5,2)],{precio:doc.precio,litros:doc.litros});}}",
           "reduce": "function(keys, values, rereduce){var importe= 0; var totallitros = 0;for(var i = 0; i < values.length; i++) {importe += values[i].precio*values[i].litros;totallitros += values[i].litros;}return importe/totallitros;}"
       }
“informe\u precios”:{
“映射”:“函数(doc){if(doc.doc_type=='precio'){emit([doc.compador,doc.fecha.substr(0,4),doc.fecha.substr(5,2)],{precio:doc.precio,litros:doc.litros}”,
“reduce”:“函数(键、值、返回值){var importe=0;var totalitros=0;for(var i=0;i
我需要降序,因为我想得到最后12个值

短暂性脑缺血发作
Diego

您总是假设您的
reduce
函数是通过
map
函数的输出调用的,即您没有处理
reduce
情况

rereduce
中,您的
值将是先前
reduce
调用中的
import/totalitros

您的reduce函数得到的是每个月的“每升价格”平均值,因此,由于这是一个平均值,因此您的
reduce
函数无法实际处理该数据,因为对于多个
,无法知道它们在平均值中的权重

因此,您需要更改函数以返回计数,这样您就可以在
rereduce
函数中使用该函数来加权平均值(我们还使用内置的
sum
函数来简化事情):

函数(键、值、返回值){
如果(减少){
var length=sum(values.map(函数(v){return v[1]}));
var avg=和(值)。映射(函数(v){
返回v[0]*(v[1]/长度)
}));
返回值[平均值,长度];
}
否则{
var-importe=0;
var Totalitros=0;
对于(变量i=0;i
您将在视图中看到的最终结果是一个数组,因此您始终需要在客户端代码中选择该数组的第一个元素

function(keys, values, rereduce) {
  if (rereduce) {
    var length = sum(values.map(function(v){return v[1]}));
    var avg = sum(values.map(function(v){
      return v[0] * (v[1] / length)
    }));
    return [avg, length];
  }
  else {
    var importe= 0;
    var totallitros = 0;
    for( var i = 0; i < values.length; i++) {
      importe += values[i].precio * values[i].litros;
      totallitros += values[i].litros;
    }
    return [ importe/totallitros, values.length ];
  }
}