1

ドキュメント (オペレーター) のリストがあり、それらにはデバイスがあります。これらの各デバイスには、またはそれ以上のタグがあります。オペレーターごとに固有のタグのリストを作成したいと考えています。

Operator1: Device1 tag_1 tag_2 Device2 tag_1 tag_3

Operator2: Device1 tag_4 tag_2 Device2 tag_1 tag_3

出力を次のようにしたい

    Operator1 -> Tags: [tag_1,tag_2,tag_3]
    Operator2 -> Tags: [tag_1,tag_2,tag_3,tag_4]

ビュー (map reduce) を使用してこれを行うにはどうすればよいですか? 以下のマッパーを使用してドキュメントを発行できました。

    function(doc) {
        if (doc.key && doc.operator && doc.tags) {
            for (tag in doc.tags) {
              emit(doc.operator, tag.toLowerCase());
            }
         }
    }

これが発する

    Key           Value
    Operator1 - > tag_1
    Operator1 - > tag_2
    Operator1 - > tag_1
    Operator1 - > tag_3
    Operator2 - > tag_1
    Operator2 - > tag_2
    Operator2 - > tag_3
    Operator2 - > tag_4

それらを次のようにグループ化する方法がわかりませんでした。

    Operator1 -> Tags: [tag_1,tag_2,tag_3]
    Operator2 -> Tags: [tag_1,tag_2,tag_3,tag_4]
4

2 に答える 2

2

reduce 関数を使用してこれを実現できます。

function (keys, values, rereduce) {
  var tags = {};
  values.forEach(function(tag) {
    if (!tags[tag]) tags[tag] = true;
  });
  return Object.keys(tags).sort();
}

valuesこれは(つまり、「タグ」)を反復し、それらの一意のリストを返します。

一般的に言えば、reduce 関数は、単純な数値のように非常に小さい出力を持つと想定されています。データセットの規模と多様性に応じて、サーバーを構成してより大きな削減出力を許可する必要がある場合があります。

于 2015-01-30T16:33:58.390 に答える
0

リデュース機能を追加。

function(keys, values) {
   return sum(values);
}

次に、パラメータ group=true を使用してクエリを実行します。

于 2015-06-03T14:48:02.803 に答える