CouchDB函数以给定的间隔对记录进行采样。

CouchDB函数以给定的间隔对记录进行采样。,couchdb,reduce,Couchdb,Reduce,我有带有时间值的记录,需要能够在一段时间内查询这些记录,并且只返回给定间隔内的记录 例如,我可能需要10分钟间隔内12:00到1:00的所有记录,即12:00、12:10、12:20、12:30。。。12:50, 01:00. 间隔需要是一个参数,可以是任何时间值。15分47秒1.4小时 我试图做一些减少,但这显然是一个错误的地方做它 这是我想到的。欢迎评论 为时间字段创建了一个视图,以便我可以查询时间范围。视图输出id和时间 function(doc) { emit([doc.rec

我有带有时间值的记录,需要能够在一段时间内查询这些记录,并且只返回给定间隔内的记录

例如,我可能需要10分钟间隔内12:00到1:00的所有记录,即12:00、12:10、12:20、12:30。。。12:50, 01:00. 间隔需要是一个参数,可以是任何时间值。15分47秒1.4小时

我试图做一些减少,但这显然是一个错误的地方做它

这是我想到的。欢迎评论

为时间字段创建了一个视图,以便我可以查询时间范围。视图输出id和时间

function(doc) { 
  emit([doc.rec_id, doc.time], [doc._id, doc.time]) 
}
然后我创建了一个list函数,它接受一个名为interval的参数。在列表函数中,我遍历行并将当前行时间与上次接受的时间进行比较。如果跨度大于或等于间隔,我将该行添加到输出中,并对其进行JSON处理

function(head, req) { 

  // default to 30000ms or 30 seconds.
  var interval = 30000; 

  // get the interval from the request.
  if (req.query.interval) {
    interval = req.query.interval; 
  }

  // setup
  var row; 
  var rows = []; 
  var lastTime = 0; 

  // go thru the results...
  while (row = getRow()) { 
      // if the time from view is more than the interval 
      // from our last time then add it.
      if (row.value[1] - lastTime > interval) { 
          lastTime = row.value[1]; 
          rows.push(row); 
      } 
  } 
  // JSON-ify!
  send(JSON.stringify({'rows' : rows}));
}

到目前为止,这是运作良好。我将测试一些大数据,看看性能如何。关于如何做得更好,或者这是沙发的正确方法,有什么评论吗?

CouchDB很放松。如果这对你有用,那么我会说坚持下去,专注于你的下一个首要任务

一种快速优化方法是尽量不要在
\u list
函数中建立最终答案,而是按照您所知道的答案的一小部分。这样,您的函数可以在不受限制的结果大小上运行

但是,正如您所怀疑的,您使用的是
\u list
函数,基本上是为了执行一个临时查询,随着数据库大小的增长,该查询可能会出现问题

我不能100%确定您需要什么,但是如果您在一个时间范围内查找文档,则很有可能
emit()
键应该主要按时间排序。(在您的示例中,主要(最左侧)排序值是
doc.rec\u id

对于映射函数:

function(doc) {
  var key = doc.time; // Just sort everything by timestamp.
  emit(key, [doc._id, doc.time]);
}
这将构建所有文档的映射,按时间戳排序。(我将假设时间值类似于
JSON.stringify(新日期)
,即
“2011-05-20T00:34:20.847Z”

要查找1小时内的所有文档,只需使用
?startkey=“2011-05-20T00:00:00.000Z”和endkey=“2011-05-20T01:00:00.000Z”查询地图视图即可


如果我理解你的“间隔”正确的标准,那么如果你需要10分钟的间隔,那么如果你有00:00,00:15,00:30,00:45,00:50,那么只有00:00,00:30,00:50应该在最终结果中。因此,你正在过滤正常的沙发输出以剔除不需要的结果。这对于
\u list
函数来说是一个完美的工作。只需使用
req.query.interval
并且只发送与间隔匹配的行。

CouchDB是放松的。如果这对你有用,那么我会说坚持下去,专注于你的下一个首要任务

一种快速优化方法是,尽量不要在
\u list
函数中建立最终答案,而是将答案的一小部分(如您所知)设置为
send()
。这样,您的函数可以在无限大的结果大小上运行

但是,正如您所怀疑的,您使用的是
\u list
函数,基本上是为了执行一个临时查询,随着数据库大小的增长,该查询可能会出现问题

我不能100%确定您需要什么,但如果您在一个时间范围内查找文档,则
emit()
键很可能主要按时间排序。(在您的示例中,主要(最左侧)排序值是
doc.rec\u id

对于映射函数:

function(doc) {
  var key = doc.time; // Just sort everything by timestamp.
  emit(key, [doc._id, doc.time]);
}
这将构建所有文档的映射,按时间戳排序。(我将假设时间值类似于
JSON.stringify(新日期)
,即
“2011-05-20T00:34:20.847Z”

要查找1小时内的所有文档,只需使用
?startkey=“2011-05-20T00:00:00.000Z”和endkey=“2011-05-20T01:00:00.000Z”查询地图视图即可


如果我理解你的“间隔”正确的标准,那么如果你需要10分钟的间隔,那么如果你有00:00,00:15,00:30,00:45,00:50,那么只有00:00,00:30,00:50应该在最终结果中。因此,你正在过滤正常的沙发输出以剔除不需要的结果。这对于
\u list
函数来说是一个完美的工作。只需使用
req.query.interval
并仅
send()
匹配间隔的行。

您可能需要
parseInt(req.query.interval)
。我不记得了,但我认为req.query中的所有内容都是字符串。您可能需要
parseInt(req.query.interval)
。我不记得了,但我认为req.query中的所有内容都是一个字符串。我很放松,正在处理我的下一个优先事项。:)不过,我会采纳您的建议,修改它,以便在我运行时发送片段,并更改排序顺序。许多记录的性能将是一个问题。我还将研究您建议如何匹配间隔,但是我需要每n秒支持一次记录,并且我可能有在同一n秒内有4条记录的实例(每秒多条记录)这意味着如果我只在间隔上进行匹配,我将为每个匹配的“间隔”获得多条记录。但我会仔细考虑,看看是否能解决。感谢反馈。:)我很放松,正在处理我的下一个优先事项。:)不过,我会接受你的建议,并在发送时修改它,并更改排序顺序。很多记录的性能将是一个问题。我还将研究您建议如何匹配间隔,但是我需要支持每n秒一次的记录,并且我可能会有这样的实例,即在同一n秒内有4条记录(每秒许多记录),这意味着如果我只在间隔上进行匹配,我将为每个匹配的“间隔”获得多条记录。但我会考虑一下,看看能不能解决。感谢您的反馈。:)