我在 couchdb 中有一个数据集,其中包含多个文档,其中列出了时间戳和一组来自传感器的信号。在此示例中,我只使用了几个不同的名称,但随着向系统中添加额外的传感器,可能会有无数不同的名称。以下是三个示例文档的示例:
{ timestamp: 12345,
signals: ["highTemperature", "highPressure"]
}
{ timestamp: 12346,
signals: ["highTemperature"]
}
{ timestamp: 12347,
signals: ["lowPressure", "highTemperature"]
}
我想做的是获得每个标签的频率。一个简单的方法是创建一个这样的地图函数:
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}
]}