3

次の形式でデータを出力するソファデータベースのビューがあります。

{"rows":[
{"key":["Partner1","Voucher Type 1"],"value":true},
{"key":["Partner1","Voucher Type 2"],"value":true},
{"key":["Partner2","Voucher Type 1"],"value":true},
{"key":["Partner3","Voucher Type 1"],"value":true},
{"key":["Partner4","Voucher Type 1"],"value":true}
]}

私がやろうとしているのは、パートナーを効果的に「グループ化」することです。バウチャーの種類。上記の例では、次のように返されます。

Partner1: ["Voucher Type 1", "Voucher Type 2"]
Partner2: ["Voucher Type 1"]
Partner3: ["Voucher Type 1"]
Partner4: ["Voucher Type 1"]

現在、私の map reduce 関数は次のようになっています。

地図:

function(
    emit([doc.PartnerName, doc.VoucherType], 1);
}

減らす:

function(keys, values) {
    return true;
}

私はgroup=true

reduce 関数でもっと多くのことをする必要があると思いますか?

4

3 に答える 3

1

次のreduceを使用して動作させました:

function(keys, values, rereduce){
  var item = {};
  r=[];

  values.forEach(function(value){
    item[value] = value;
  });

  for(var i in item){
    r.push(item[i]);
  }

  return r; 
}

これが正しくない場合はコメントを歓迎しますが、目的の形式でデータが返されます:

PartnerName: VoucherType[]
于 2013-04-30T14:54:11.050 に答える
1

次の設計ドキュメントを検討してください。

{
   "_id": "_design/ddoc",
   "views": {
       "partners": {
           "map": function(doc) {
                      emit(doc.PartnerName, doc.VoucherType);
                  },
           "reduce": function(keys, values) {
                         var voucherTypes = [];
                         values.forEach(function(v) {
                             voucherTypes = voucherTypes.concat(v);
                         });
                         return voucherTypes;
                     }
       }
   }
}

あなたができることは、group=trueパラメーターでreduce関数を使用することです。つまり、

<couchdb>/<database>/_design/ddoc/_view/partners?group=true

次のようなものが得られます。

{"rows":[
{"key":"Partner1","value":["Voucher Type 2","Voucher Type 1"]},
{"key":"Partner2","value":["Voucher Type 1"]},
{"key":"Partner3","value":["Voucher Type 2"]}
]}

ただし、reduce 関数でデータ構造を構築しているため、これはあまりお勧めできません。Reduce 関数は単純な、通常は数値を返す必要があります。また、上記の reduce 関数は、rereduce の場合に壊れる可能性があります。私はこれをテストしていません。別の方法として、マップ関数のみを使用してクエリを実現することを提案できます。つまり、

<couchdb>/<database>/_design/ddoc/_view/partners?reduce=false&key="Partner1"

これは次を返します:

{"total_rows":4,"offset":0,"rows":[
{"id":"97c7ee4d90f57407bb1f4f680d20967b","key":"Partner1","value":"Voucher Type 1"},
{"id":"97c7ee4d90f57407bb1f4f680d20a049","key":"Partner1","value":"Voucher Type 2"}
]}
于 2013-04-30T13:34:08.513 に答える