使用CouchDB视图,我可以同时计算组和按键范围进行过滤吗?

rew*_*wbs 10 couchdb mapreduce

我正在使用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'}
Run Code Online (Sandbox Code Playgroud)

我可以轻松创建一个按灵活日期范围过滤文档的视图.这可以通过下面的视图来完成,例如使用键范围参数调用_view/all-docs?startkey=20120101-0000&endkey=20120201-0000.

所有文档/ map.js:

function(doc) {
    emit(doc.date, doc);
}
Run Code Online (Sandbox Code Playgroud)

使用上面的数据,这将返回一个CouchDB视图,其中只包含前4个文档(日期范围内的唯一文档).

我还可以创建一个查询给定字段的出现次数的查询,如下所示,使用分组调用,即_view/author-count?group=true:

笔者数/ map.js:

function(doc) {
  emit(doc.author, 1);
}
Run Code Online (Sandbox Code Playgroud)

笔者数/ reduce.js:

function(keys, values, rereduce) {
  return sum(values);
}
Run Code Online (Sandbox Code Playgroud)

这将产生类似于:

{
    "rows": [
        {"key":"bart","value":1},
        {"key":"homer","value":2}
        {"key":"lisa","value":2}
     ]
}
Run Code Online (Sandbox Code Playgroud)

但是,我找不到按日期过滤和计算事件的最佳方法.例如,使用上面的数据,我希望能够指定范围参数,startkey=20120101-0000&endkey=20120201-0000并获得这样的结果,其中最后一个文档从计数中排除,因为它超出了指定的日期范围:

{
    "rows": [
        {"key":"bart","value":1},
        {"key":"homer","value":2}
        {"key":"lisa","value":1}
     ]
}
Run Code Online (Sandbox Code Playgroud)

最优雅的方式是什么?这可以通过单个查询实现吗?我应该使用另一个CouchDB构造,还是一个足够的视图?

Ant*_*nio 0

您需要创建一个组合视图:

组合/map.js:

function(doc) {
    emit([doc.date, doc.author], 1);
}
Run Code Online (Sandbox Code Playgroud)

组合/reduce.js:

_sum
Run Code Online (Sandbox Code Playgroud)

这样您就可以按开始/结束日期过滤文档。

startkey=[20120101-0000, "a"]&endkey=[20120201-0000, "a"]
Run Code Online (Sandbox Code Playgroud)