Couchdb:在单个视图中进行筛选和分组

Couchdb:在单个视图中进行筛选和分组,couchdb,Couchdb,我有一个Couchdb数据库,其文档格式为:{Name,Timestamp,Value} 我有一个视图,它显示了一个按名称和值的总和分组的摘要。这是直接还原函数 现在我想过滤视图,只考虑时间戳出现在给定范围内的文档 AFAIK这意味着我必须在map函数的发出键中包含时间戳,例如emit([doc.timestamp,doc.Name],doc) 但一旦我这样做了,reduce函数就不再看到将行分组在一起来计算总和。如果我把名字放在第一位,我只能在第1级分组,但如何在第2级过滤 有什么方法可以做到

我有一个Couchdb数据库,其文档格式为:{Name,Timestamp,Value}

我有一个视图,它显示了一个按名称和值的总和分组的摘要。这是直接还原函数

现在我想过滤视图,只考虑时间戳出现在给定范围内的文档

AFAIK这意味着我必须在map函数的发出键中包含时间戳,例如
emit([doc.timestamp,doc.Name],doc)

但一旦我这样做了,reduce函数就不再看到将行分组在一起来计算总和。如果我把名字放在第一位,我只能在第1级分组,但如何在第2级过滤


有什么方法可以做到这一点吗?

我不认为只有一个HTTP获取和/或在您自己的代码中没有其他逻辑就可以做到这一点

如果您
emit([time,name])
您将能够查询
startkey=[timeA]&endkey=[timeB]&group_level=2
以获得时间戳和名称相同的
timeA
timeB
之间的项目分组。然后,您可以在名称匹配时对其进行后期处理,使其相加,但初始结果集可能比您想要处理的要大

另一种方法是
emit([名称,时间])
。然后,您可以首先使用
group_level=1
进行查询,以获得名称列表[如果您的应用程序还不知道它们将是什么]。然后,对于其中的每一个,您将查询
startkey=[nameN]&endkey=[nameN,{}]&group_level=2
,以获取每个名称的摘要


(请注意,在我的查询示例中,我没有对JSON开始/结束键进行编码,以使其更易于阅读,但在实际使用中,您需要在其上应用与JavaScript的
encodeURIComponent
等效的语言。)

您不能在视图上创建视图。您需要编写另一个map reduce视图,该视图具有过滤功能并最终进行分组。比如:

map:
function(doc) {
  if (doc.timestamp > start and doc.timestamp < end ) {
    emit(doc.name, doc.value);
  }
}

reduce:
function(key, values, rereduce) {
  return sum(values);
}
map:
功能(doc){
如果(doc.timestamp>start和doc.timestamp

我想您不能存储此视图,必须将其作为特别查询放入应用程序中。

可以。我修复了示例中的一个bug(您需要发出一个数组),这可能会有所帮助。然而,我对输出如何分组的描述似乎也有误导性,接下来我将尝试修改。