1

CouchDB1.01で解決されたかなり単純な問題のように見える問題が発生しています。私のデータは基本的に、30の奇妙な診療所から調剤された薬のログであり、薬に関するいくつかの基本的なデータとタイムスタンプが含まれています。マップの結果として、かなり普通のオブジェクトのグループを疑似形式でreduceに渡します。

Key:ClinicName, Value:{"vaccine":DrugType, "stamp":TimeStamp}

私のreduce機能の目的は、調剤された各タイプの薬剤の量をすばやく参照できるようにすることです。

地図

function(doc) {
   if(doc.type=="dose"){
    emit(doc.clinicName, {"vaccine":doc.vaccine,"stamp":doc.timestamp});
   }
}

減らす

function(keys, values){
  var indexes = Object.keys(values);
  var vCount = new Object;
  for (var c in indexes){
    var val = values[c]
    var vname = val.vaccine
    if(vCount.hasOwnProperty(vname)){
      vCount[vname] = vCount[vname] + 1;
    }
    else{
      vCount[vname] = 1;
    }  
  }
  return vCount;
}

これは、descending=falseおよびgroup=trueである限り、?key=特定のClinicNameを使用している場合に完全に機能します。降順をtrueに設定するとすぐに、私の結果は途中で途切れます。

2つの質問:

  1. 結果の順序がreduce関数にとって重要なのはなぜですか?リデュースをオフにすると、結果は順方向と逆方向で同じになります。
  2. あなたの削減が単一のスカラーを提供しない場合、あなたはおそらくそれを間違っているとどこかで読んだでしょう。これ以外の奇妙な振る舞いが不十分なアプローチである場合、ログスタイルのデータソースからこの種のデータを提示する正しい方法は何ですか?
4

3 に答える 3

1

クリニックごとのワクチンの量(数)を知りたい場合は、キーにそれが必要です。

// pseudo-form
Key:[ClinicName, DrugType], Value:{"stamp":TimeStamp}

次に、reduceの「関数」は単純に文字列にすることができます"_count"

?group_level=2これにより、ワクチンごとに診療所ごとに1つの行を設定して取得でき、すべての用量の合計がディスペンスされます。これはあなたには関係がないかもしれませんが、あなたは無料でクリニックごとの(すべての薬の)用量を数える能力を手に入れます?group_level=1

すべての診療所でワクチンの総数を取得するには、その見解は薬剤のみに基づいている必要があります。

// pseudo-form
Key:DrugType, Value:{"stamp":TimeStamp}

主なポイントは、reduceは、マップ出力で互いに隣接している行に対して常に機能する必要があるということです。次に、?group_levelまたはstartkey/endkeyを使用して意味のある結果を得ることができます。

于 2012-04-27T01:02:20.380 に答える
1

質問 2 の答えは簡単です。

「単一スカラー」の経験則は、始めるには問題ありませんが、多くの高度なアプリケーションがあなたとまったく同じようにオブジェクトを使用するのを見てきました。

たとえば、オブジェクト内の関連する値の合計に関する最近の回答を参照してください: https://stackoverflow.com/a/10082894/2938

于 2012-04-27T00:51:51.080 に答える
0

ジェイソンの答えは素晴らしく正しいですが、これに出くわした人にとって、私の根本的な問題は、reduce がどのように機能するかを理解していないことでした。

最も重要なことは、couchdb がリダクションを並行して実行するため、reduce 関数の出力自体がリダクション可能でなければならないということです。キーに一致する行が 1000 行ある場合、couch は 100 行を 10 セット取り、それぞれに関数を適用します。次に、前の削減の 10 個の出力を再削減して、キーセットの解に到達します。

おそらくドキュメントを読むのが最善です...

CouchDB ドキュメントの Reduce/Rereduce セクションを読む

于 2012-08-03T05:41:16.503 に答える