1

タイムスタンプとセンサーからの信号のセットをリストする複数のドキュメントを含むデータセットがcouchdbにあります。この例では、いくつかの異なる名前しか使用していませんが、システムに追加のセンサーが追加されると、無限の数の異なる名前が存在する可能性があります。3 つのサンプル ドキュメントの例を次に示します。

{ timestamp: 12345,
  signals: ["highTemperature", "highPressure"]
}

{ timestamp: 12346,
  signals: ["highTemperature"]
}

{ timestamp: 12347,
  signals: ["lowPressure", "highTemperature"]
}

私ができるようにしたいのは、各タグの頻度を取得することです。これを行う簡単な方法は、次のような map 関数を作成することです。

function (doc) {
  for (var idx in doc.signals) {
  emit(doc.signals[idx], 1);
}

次のようなreduce関数とともに:

function(signal, counts) {
  var sum = 0;
  for(var i = 0; i < counts.length; i++) {
    sum += counts[i]; 
  };
  return sum; 
}

これにより、次のような適切なデータ セットが返されます。

{"rows":[
  {"key":"highTemperature","value":3},
  {"key":"highPressure","value":1},
  {"key":"lowPressure","value":1}
]}

これは、信号の分布を常に知りたい場合に便利ですが、タイムスタンプ 12346 ~ 12349 など、データ ポイントのサブセットのタグの分布を知りたいのです。タイムスタンプを使用startkeyendkey、タイムスタンプはキーの一部ではないため、タイムスタンプによるデータ。タイムスタンプをキーにする場合、信号の分布を取得するために減らすことはできません。

キーの一部ではない要素を減らすために、そのようなグループ化を行う方法はありますか? 理想的には、次のような URL パラメーターを使用してグループ化間隔を指定し、次のように、/mydb/_design/main/_view/signalsByTime?startkey=12346&endkey=12347その期間のシグナルの分布を返すようにします。

{"rows":[
  {"key":"highTemperature","value":2},
  {"key":"lowPressure","value":1}
]}
4

1 に答える 1

2

キーになりたい場合timestamp、可能なシグナルの数が非常に少ない場合(O(1)例のように3つと仮定します)、mapシグナルの特性ベクトルで放出できます:

if (doc.signal == "highTemperature") {
  emit(doc.timestamp, [1,0,0]);
} else if (doc.signal == "highPressure") {
  emit(doc.timestamp, [0,1,0]);
} ...

おそらくreduce次のようになります。

function(keys, values) {
  var sum = [0,0,0];
  for (v in values) {
    for (s in sum) {
      sum[s] += values[v][s];
    }
  }
  return sum; 
}
于 2012-10-15T21:46:59.060 に答える