2011-06-09 49 views
5

如果我有一个地图功能发出时间戳作为关键字和数字作为文档,如何获取选择日期范围的值的总和?如何使用couchdb在日期范围内总结视图的值?

编辑 文档的例子是:

{ 
    "_id": "[2011, 6, 7, 10, 55]", 
    "_rev": "1-f87d54608d36cd2e28add67e88e416a4", 
    "volt": 107, 
    "ampere": 23.5 
} 

的观点是:

{ 
    "_id": "_design/power", 
    "_rev": "1-7788287ab51c480c725498eba4f79ddb", 
    "language": "javascript", 
    "views": { 
     "watt": { 
      "map": "function(doc) {\n emit(doc._id, doc.volt * doc.ampere);\n}" 
     } 
    } 
} 

我需要查询例如:每小时平均三月份。

+0

请包括示例文档和您的地图功能源 – 2011-06-09 15:25:16

回答

6

当你想对日期信息做一个范围查询时,我发现你的地图函数发出一个问题,将你的_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 - Query Options

编辑:

我注意到你提到的按小时想组吧。您将继续将分组级别降低至密钥的小时部分。

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} 
]} 

我怕我的测试数据库没有非常有用的信息,但我希望我如何显示startkey/endkey和group_level可以使用。

0

可以使用_sum内置的reduce

"reduce":"_sum" 

然后,你需要使用合适的组级查询您的观点和startkeyendkey

GET db/_design/power/_view/watt?group_level=2&startkey=[2011,3]&endky=[2011,4]&inclusive_end=false 

这就给了你三月份的总和。格式化

+0

我需要制作一个图表,每小时总计值限制为3月。所以我不需要一个数字与整个三月份的总和。 – fdb 2011-06-09 16:34:41