排序降序时CouchDB为null值

时间:2016-03-27 13:41:31

标签: view mapreduce couchdb

我有CouchDB视图,它以自然顺序给我一个正确的值,当按降序排序时为null,这里是Futon截图:

Natural order

Descending order

以下是视图代码:

"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个最后的值。

TIA 迭

1 个答案:

答案 0 :(得分:1)

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

rereducevalues importe/totallitros将成为之前reduce次来电的rereduce值。

你的reduce功能每个月都会获得“每升价格”的平均值,所以因为它是一个平均值,你的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 ]; } } 函数让事情更简单):

public class Grid {
  private int[][] myGrid;
  private int x, y;

  public Grid(int x, int y) {
    myGrid = new int[y][x];
  }
}

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