2

多数の航空機の情報を含む CouchDB のサンプル データベースと、製造元をキーとして、モデルを値として示すビューがあります。

マップ機能は

function(doc) {
    emit(doc["Manufacturer"], doc._id)
}

そしてreduce関数は

function(keys, values, rereduce){
    return values.length;
}

これはとても簡単です。そして、26 機のボーイング機がある Futon を使用してビューを表示すると、実際に正しい結果が得られます。

"BOEING"    26

しかし、REST クライアントを使用してビューをクエリすると、

http://localhost:6060/aircrafts/_design/basic/_view/VendorProducts?key="BOEING"

私は得る

{"rows":[
    {"key":null,"value":2}
]}

さまざまなクライアント (Web ブラウザー、REST クライアント拡張機能、curl など) をテストしましたが、すべて 2 という値が得られました! 他のキーを使用したクエリは正しく機能します。

MapReduce 関数またはクエリに何か問題がありますか?

4

2 に答える 2

1

あなたは罠に陥っているようですre-reduce。厳密に言えば、Couchdb はmap-reduce-rereduceプロセスを使用します。

  • マップ: データを出力形式に再フォーマットします。
  • Reduce: いくつかのデータを集約します (同じキーを持つすべてのエントリではありません) - これはあなたのケースでは正しく機能します。
  • Re-reduce: reduce と同じことを行いますが、以前に縮小されたデータに対して行います。

reduce ステージで値の形式を変更すると、re-reduce 呼び出しによって、既に削減された値の数が集計されます。

ソリューション:

  1. マップの値を 1 に設定し、値の合計を減らすことができます。
  2. チェックしrereduce==true、その場合は値の合計を返します。これは、最初の reduce によって返される整数値になります。
于 2014-06-28T22:20:26.417 に答える