CouchDB使用日期过滤器减少总和

时间:2015-11-26 04:05:19

标签: couchdb

我对couchdb和map / reduce一般都是新手。我有以下观点:

{
  "_id": "_design/keys",
  "views": {
    "keys": {
      "map": "function(doc) { for (var thing in doc) { if (doc.created_at != null) { emit([thing, doc.created_at],1); } } }",
      "reduce": "function(key,values) { return sum(values); }"
    }
  }        
}

这很适合给我一个数据库中所有文档键的计数总和以及正确的group_level:

.../_design/keys/_view/keys?group_level=1

{"rows":[
  {"key":["_id"],"value":2},
  {"key":["_rev"],"value":2},
  {"key":["created_at"],"value":2},
  {"key":["testing"],"value":2}
 ]}

现在我要做的是按日期减少这些映射文档,这是一个IOS8601字符串:

  {"rows":[
    {"key":["_id","2015-11-25T21:13:58Z"],"value":1},
    {"key":["_id","2015-11-25T21:14:39Z"],"value":1},
    {"key":["_rev","2015-11-25T21:13:58Z"],"value":1},
    {"key":["_rev","2015-11-25T21:14:39Z"],"value":1},
    {"key":["created_at","2015-11-25T21:13:58Z"],"value":1},
    {"key":["created_at","2015-11-25T21:14:39Z"],"value":1},
    {"key":["testing","2015-11-25T21:13:58Z"],"value":1},
    {"key":["testing","2015-11-25T21:14:39Z"],"value":1}
  ]}

但我仍然希望按键的第一部分分组结果。也就是说,我想指定2015-11-25T21:13:57Z的开始时间和2015-11-25T21:13:59Z的结束时间,并使用2015-11-25T21:13:58Z的时间戳取回所有内容,如下所示:

{"rows":[
  {"key":["_id"],"value":1},
  {"key":["_rev"],"value":1},
  {"key":["created_at"],"value":1},
  {"key":["testing"],"value":1}
 ]}

我该怎么做?

2 个答案:

答案 0 :(得分:1)

你应该使用你的视图函数发出时间戳的日期组件(正如你所说的那样,它已经在层次结构中很方便)作为一个复杂的键:

而不是" 2015-11-26T ...",按[2015,11,26,21,13,58]发出密钥

然后,您可以将复杂键的查询范围扩展到不同的级别(年,月,日,时间)。请注意,如果您使用Zulu时间以外的时间,您可能需要使用视图函数来读取tz并在Zulu时间内发出以便正确排序。

请原谅从移动设备输入的拼写错误

答案 1 :(得分:0)

几天前我遇到了类似的问题,发现List Functions是解决这个问题的一种非常简单的方法。您可以简单地使用日期作为键,things作为值,在列表函数中进行计数,并仍然可以使用所有常规视图功能来定义开始和结束键。