【问题标题】:how to sum values of a view in a date range using couchdb?如何使用 couchdb 对日期范围内的视图值求和?
【发布时间】:2011-09-11 19:04:17
【问题描述】:

如果我有一个地图函数发出一个时间戳作为键和一个数字作为文档,如何获得选择日期范围的值的总和?

编辑 一个文档示例是:

{
   "_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}"
       }
   }
}

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

【问题讨论】:

  • 请附上示例文件和你的地图函数源

标签: timestamp couchdb sum aggregate reduce


【解决方案1】:

您可以使用内置的_sum 作为reduce

"reduce":"_sum"

然后您需要使用适当的组级别和startkeyendkey 查询您的视图:

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

这为您提供了 3 月份的总和。格式化

【讨论】:

  • 我需要制作一个图表,其中每小时的总和限制在 3 月。所以我不需要一个数字与整个三月的总和。
【解决方案2】:

当您想对日期信息进行范围查询时,我发现您的 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 - 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。

【讨论】:

    猜你喜欢
    • 2018-03-31
    • 1970-01-01
    • 1970-01-01
    • 2018-12-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多