我有一个Couchdb数据库,其中包含以下形式的文档:{Name,Timestamp,Value}
我有一个视图,显示按名称分组的摘要以及值的总和。这是直接的减少功能。
现在我想过滤视图,只考虑在给定范围内出现时间戳的文档。
AFAIK这意味着我必须在地图功能的发射键中包含时间戳,例如。 emit([doc.Timestamp, doc.Name], doc)
但是,只要我这样做,reduce函数就不再会将行组合在一起来计算总和。如果我把名字放在第一位,我只能在第1级进行分组,但如何在第2级进行过滤?
有办法做到这一点吗?
答案 0 :(得分:1)
我认为只有一次HTTP抓取和/或您自己的代码中没有其他逻辑,这是不可能的。
如果您emit([time, name])
,您可以查询startkey=[timeA]&endkey=[timeB]&group_level=2
,以便将timeA
和timeB
之间的项目分组,其中时间戳和名称为相同。然后,只要名称匹配,您就可以对此进行后期处理,但初始结果集可能比您想要处理的要大。
替代方案是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);
}
我想您无法存储此视图,必须将其作为临时查询添加到您的应用程序中。