Couchdb:在单个视图中过滤和分组

时间:2010-12-22 20:07:46

标签: couchdb

我有一个Couchdb数据库,其中包含以下形式的文档:{Name,Timestamp,Value}

我有一个视图,显示按名称分组的摘要以及值的总和。这是直接的减少功能。

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

AFAIK这意味着我必须在地图功能的发射键中包含时间戳,例如。 emit([doc.Timestamp, doc.Name], doc)

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

有办法做到这一点吗?

2 个答案:

答案 0 :(得分:1)

我认为只有一次HTTP抓取和/或您自己的代码中没有其他逻辑,这是不可能的。

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

替代方案是emit([name,time])。然后,您可以先使用group_level=1查询以获取名称列表[如果您的应用程序尚不知道它们将是什么]。然后,对于每一个,您将查询startkey=[nameN]&endkey=[nameN,{}]&group_level=2以获取每个名称的摘要。

(请注意,在我的查询示例中,我将JSON开始/结束键保留为未编码,以使其更具人性化,但您需要在其上应用您的语言相当于JavaScript的encodeURIComponent在实际使用中。)

答案 1 :(得分:-2)

您无法查看视图。您需要编写另一个具有过滤功能的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);
}

我想您无法存储此视图,必须将其作为临时查询添加到您的应用程序中。