我正在使用 CouchDB。我希望能够在查询时指定的日期范围内计算特定字段值的出现次数。我似乎能够完成其中的一部分,但我无法理解将它们整合在一起的最佳方式。
假设具有时间戳字段和另一个字段的文档,例如:
{ date: '20120101-1853', author: 'bart' }
{ date: '20120102-1850', author: 'homer'}
{ date: '20120103-2359', author: 'homer'}
{ date: '20120104-1200', author: 'lisa'}
{ date: '20120815-1250', author: 'lisa'}
我可以轻松地创建一个按灵活日期范围过滤文档的视图。这可以通过如下视图来完成,使用关键范围参数调用,例如_view/all-docs?startkey=20120101-0000&endkey=20120201-0000
.
所有文档/map.js:
function(doc) {
emit(doc.date, doc);
}
使用上面的数据,这将返回一个仅包含前 4 个文档(日期范围内唯一的文档)的 CouchDB 视图。
我还可以创建一个查询给定字段的出现次数,就像这样,通过分组调用,即_view/author-count?group=true
:
作者计数/map.js:
function(doc) {
emit(doc.author, 1);
}
作者计数/reduce.js:
function(keys, values, rereduce) {
return sum(values);
}
这将产生类似:
{
"rows": [
{"key":"bart","value":1},
{"key":"homer","value":2}
{"key":"lisa","value":2}
]
}
但是,我找不到按日期过滤和计数出现次数的最佳方法。例如,使用上面的数据,我希望能够指定范围参数startkey=20120101-0000&endkey=20120201-0000
并获得这样的结果,其中最后一个文档被排除在计数之外,因为它超出了指定的日期范围:
{
"rows": [
{"key":"bart","value":1},
{"key":"homer","value":2}
{"key":"lisa","value":1}
]
}
最优雅的方法是什么?这可以通过单个查询来实现吗?我应该使用另一个 CouchDB 构造,还是一个视图就足够了?