降序排序时CouchDB为空值



我有一个CouchDB视图,它按自然顺序给我一个正确的值,按降序排序时为null,下面是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;}"
       }

我需要它递减,因为我想得到最后12个值。

TIADiego

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

rereduce中,您的values将是以前reduce调用中的importe/totallitros值。

你的reduce函数得到的是每个月的"每升价格"平均值,所以因为这是一个平均值,你的rereduce函数没有办法实际处理这些数据,因为对于多个values,没有办法知道它们在平均值中的重量。

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

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 ];
  }
}

您将在这里的视图中看到的最终结果将是一个数组,因此您总是需要在客户端代码中挑选出该数组的第一个元素。

相关内容

  • 没有找到相关文章

最新更新