2016-03-27 8 views
2

降順とき、私はここに、私の自然な順序とヌルソート降順に正しい値を与えるCouchDBのビューを持って布団のスクリーンショットは、以下のとおりです。CouchDBのNULL値のソート

ここ

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

あなたはいつもすなわち、あなたのreduce機能がごmap関数の出力と呼ばれていることを前提としています。あなたはrereduceの状況を処理していません。

rereducevaluesは、前のreduceからのimporte/totallitrosの値になります。

あなたのreduce関数は毎月の平均値であるため、平均値であるため、rereduce関数がそのデータを実際に処理する方法はありません。複数のvaluesが入ってくるので、平均して

だから、あなたは(私たちはまた、物事を簡単にするために作り付けのsum機能を使用している)rereduce機能で平均を重み付けすることを使用できるように、カウントを返すために、あなたの関数を変更する必要があります:

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

最終的な結果は配列になりますので、クライアントコードの最初の要素を常に選択する必要があります。