fdb*_*fdb 5 reduce timestamp couchdb aggregate sum
如果我有一个地图函数发出时间戳作为关键广告作为文档的数字,如何获取选择日期范围的值的总和?
编辑文档示例是:
{
"_id": "[2011, 6, 7, 10, 55]",
"_rev": "1-f87d54608d36cd2e28add67e88e416a4",
"volt": 107,
"ampere": 23.5
}
Run Code Online (Sandbox Code Playgroud)
观点是:
{
"_id": "_design/power",
"_rev": "1-7788287ab51c480c725498eba4f79ddb",
"language": "javascript",
"views": {
"watt": {
"map": "function(doc) {\n emit(doc._id, doc.volt * doc.ampere);\n}"
}
}
}
Run Code Online (Sandbox Code Playgroud)
我需要查询例如:3月份的平均每小时.
当您想要对日期信息进行范围查询时,我发现您的地图功能会将_id作为键发出问题.您应该将日期信息保存在单独的字段中._id必须是一个字符串,您将无法正确执行startkey-endkey查询.
就像是:
{
"_id": "997b9f758899f102ab58570686001bc2",
"_rev": "1-f87d54608d36cd2e28add67e88e416a4",
"date": [2011, 6, 7, 10, 55],
"volt": 107,
"ampere": 23.5
}
Run Code Online (Sandbox Code Playgroud)
然后你的设计文档会变成:
{
"_id": "_design/power",
"_rev": "1-7788287ab51c480c725498eba4f79ddb",
"language": "javascript",
"views": {
"watt": {
"map": "function(doc) {\n emit(doc.date, doc.volt * doc.ampere);\n}",
"reduce": "_sum"
}
}
}
Run Code Online (Sandbox Code Playgroud)
您可以使用组级别根据[年,月,日,小时,分钟]的键控制信息的返回方式.组级别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}
]}
Run Code Online (Sandbox Code Playgroud)
删除分组和使用键范围过滤也可以获得所需的信息,但它看起来会有所不同.
GET db/_design/power/_view/watt?startkey=[2011,4]&endkey=[2011,6]
{"rows":[
{"key":null,"value":3977.0}
]}
Run Code Online (Sandbox Code Playgroud)
将它们组合到两者中以在减少之前对值进行分组并过滤掉您不想要的月份.
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}
]}
Run Code Online (Sandbox Code Playgroud)
无论如何,只是想彻底...也帮助我记住这些东西.
编辑:
我注意到你提到要按小时分组.您可以将分组级别延续到密钥的小时部分.
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}
]}
Run Code Online (Sandbox Code Playgroud)
我担心我的测试数据库没有非常有用的信息,但我希望我展示了如何使用startkey/endkey和group_level.