【问题标题】:couchdb reduce on non-key valuecouchdb 减少非键值
【发布时间】:2012-10-05 17:05:33
【问题描述】:

我在 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。但是,我做不到使用startkeyendkey 按时间戳对数据进行切片,因为时间戳不是键的一部分。如果我让时间戳是关键,那么我就无法减少以获得信号的分布。

有没有办法进行这样的分组,以便减少不属于键的元素?理想情况下,我想通过 URL 参数指定分组间隔,例如:/mydb/_design/main/_view/signalsByTime?startkey=12346&amp;endkey=12347,并让它返回该时间段的信号分布,如下所示:

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

【问题讨论】:

  • 您想如何指定分组间隔?
  • 编辑了问题以澄清。我想使用 startkey 和 endkey 来指定我应该聚合信号的时间戳范围。从功能上讲,如果我可以拥有一个视图 emit(doc.timestamp, doc.signal[idx]) 然后在 (value, key) 集合而不是 (key, value) 集合上运行 reduce ,这将非常容易。
  • 好吧,我不擅长观看。

标签: javascript mapreduce couchdb


【解决方案1】:

如果您希望 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; 
}

【讨论】:

  • 当潜在信号集很小但在我的系统中集实际上非常大并且可以随时增长时,这是一个很好的答案。这是一个很好的答案,但它并不能完全解决我的问题,但这主要是因为我在第一种情况下对我的问题不够清楚。
  • 你能预测任何关于查询的事情吗?也许您将选择的范围有一些界限,一些颗粒,例如时间戳总是四舍五入到分钟,范围不超过一小时,等等?在我看来,动态任意查询并不是 Couch 的设计目的。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-10-31
  • 2013-04-24
  • 2020-05-31
  • 1970-01-01
  • 1970-01-01
  • 2017-02-16
相关资源
最近更新 更多