用日期过滤器减少CouchDB和

用日期过滤器减少CouchDB和,couchdb,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,va

一般来说,我对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); }"
    }
  }        
}
这可以很好地为我提供数据库中所有文档键(具有适当的组\级别)的总数:

.../_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}
 ]}

我怎样才能做到这一点呢?

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

您应该使用view函数来发出时间戳的日期组件(正如您所注意的,它已经方便地处于层次结构中)作为一个复杂的键:

而不是“2015-11-26T…”,将键发射为[2015,11,26,21,13,58]

然后,您可以将复杂关键字的查询范围设置为不同的级别(年、月、日期、时间)。请注意,如果使用Zulu时间以外的时间,则可能需要使用view函数读取tz并在Zulu时间内发出,以便所有时间都正确排序


请原谅从移动设备输入的打字错误

这太好了