当您想要对日期信息进行范围查询时,我发现您的 map 函数将您的 _id 作为键发出问题。您应该将日期信息保存在单独的字段中。_id 必须是一个字符串,您将无法对其正确执行 startkey-endkey 查询。
就像是:
{
"_id": "997b9f758899f102ab58570686001bc2",
"_rev": "1-f87d54608d36cd2e28add67e88e416a4",
"date": [2011, 6, 7, 10, 55],
"volt": 107,
"ampere": 23.5
}
然后你的设计文件会变成这样:
{
"_id": "_design/power",
"_rev": "1-7788287ab51c480c725498eba4f79ddb",
"language": "javascript",
"views": {
"watt": {
"map": "function(doc) {\n emit(doc.date, doc.volt * doc.ampere);\n}",
"reduce": "_sum"
}
}
}
您可以使用组级别根据您的 [年、月、日、小时、分钟] 键来控制信息的返回方式。组级别 1 将是一年、2 个月等的总计。除此之外,您可以使用 startkey 和 endkey 对其进行过滤。
GET db/_design/power/_view/watt?group_level=2
应该给你类似的东西:
{"rows":[
{"key":[2011,4],"value":1988.5},
{"key":[2011,5],"value":1988.5},
{"key":[2011,6],"value":7778.0}
]}
使用键范围删除分组和过滤也可以获得所需的信息,但看起来会有所不同。
GET db/_design/power/_view/watt?startkey=[2011,4]&endkey=[2011,6]
{"rows":[
{"key":null,"value":3977.0}
]}
在减少和过滤掉您不想要的月份之前,将它们组合起来以对值进行分组。
GET db/_design/power/_view/watt?startkey=[2011,4]&endkey=[2011,6]&group_level=2
{"rows":[
{"key":[2011,4],"value":1988.5},
{"key":[2011,5],"value":1988.5}
]}
无论如何,只是想彻底……也有助于我记住这些东西。
CouchDB HTTP View API - 查询选项
编辑:
我注意到您提到要按小时分组。您将继续分组级别,直到您的密钥的小时部分。
GET db/_design/power/_view/watt?startkey=[2011,4]&endkey=[2011,6]&group_level=4
{"rows":[
{"key":[2011,4,9,11],"value":1988.5},
{"key":[2011,5,9,11],"value":1988.5}
]}
I'm afraid that my test database didn't have very useful information, but I hope I displayed how startkey/endkey and group_level can be used.