我对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}
]}
我该怎么做?
答案 0 :(得分:1)
你应该使用你的视图函数发出时间戳的日期组件(正如你所说的那样,它已经在层次结构中很方便)作为一个复杂的键:
而不是" 2015-11-26T ...",按[2015,11,26,21,13,58]发出密钥
然后,您可以将复杂键的查询范围扩展到不同的级别(年,月,日,时间)。请注意,如果您使用Zulu时间以外的时间,您可能需要使用视图函数来读取tz并在Zulu时间内发出以便正确排序。
请原谅从移动设备输入的拼写错误
答案 1 :(得分:0)
几天前我遇到了类似的问题,发现List Functions是解决这个问题的一种非常简单的方法。您可以简单地使用日期作为键,things
作为值,在列表函数中进行计数,并仍然可以使用所有常规视图功能来定义开始和结束键。