タイムスタンプとセンサーからの信号のセットをリストする複数のドキュメントを含むデータセットが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 など、データ ポイントのサブセットのタグの分布を知りたいのです。タイムスタンプを使用startkey
しendkey
、タイムスタンプはキーの一部ではないため、タイムスタンプによるデータ。タイムスタンプをキーにする場合、信号の分布を取得するために減らすことはできません。
キーの一部ではない要素を減らすために、そのようなグループ化を行う方法はありますか? 理想的には、次のような URL パラメーターを使用してグループ化間隔を指定し、次のように、/mydb/_design/main/_view/signalsByTime?startkey=12346&endkey=12347
その期間のシグナルの分布を返すようにします。
{"rows":[
{"key":"highTemperature","value":2},
{"key":"lowPressure","value":1}
]}