【问题标题】:couchdb/cloudant time series queryingcouchdb/cloudant 时间序列查询
【发布时间】:2016-08-30 12:11:01
【问题描述】:

我有一个 cloudant 数据库,其中包含来自多个设备的度量集合。 每个设备发送许多测量值,但三个是感兴趣的:温度、纬度和经度。 由于系统的设计,每个值都是一个单独的度量(在插入时我不能轻易地加入温度、纬度和经度),并且在数据库中我有一组像这样的度量:

{
  "device": "foo",
  "name": "temperature",
  "date": <timestamp>,
  "value": <value>
},
{
  "device": "foo",
  "name": "latitude",
  "date": <timestamp>,
  "value": <value>
},
{
  "device": "foo",
  "name": "longitude",
  "date": <timestamp>,
  "value": <value>
},

所以从概念上讲,我有 3 个时间序列。 我想提取这些时间序列中的每一个的最新度量,理想情况下将它们按设备分组。

类似:

{
  device1: {
    "temperature": {
      date: <date>,
      value: <value>
    },
    "latitude": {
      date: <date>,
      value: <value>
    },
   "longitude": {
      date: <date>,
      value: <value>
   }
  },
  "device2": {
    ...
  }
}

我不期望这种确切的语法,这只是我期望的数据集的一个概念。

我可以将位置测量连接在一起,但问题是一样的:如何将每个设备的最后一个 ts 条目组合在一起?

【问题讨论】:

  • 为了确定,last ts 代表最后一个时间戳?
  • 不,我指的当然是按日期的最后一个时间序列条目(大致相同)
  • 在我回答您的问题之前的最后一个问题,每个测量的“日期”条目对于一个条目中的每个值都不相同?不应该是:{“_id”:“123909012”,“设备1”:{“纬度”:“”,“经度”:“”,“温度”:“”},“设备2”:{“纬度” : "", "经度": "", "温度": "" } }
  • 不,每个值的日期可能不同

标签: couchdb time-series cloudant


【解决方案1】:

首先,我会使用这样的数据结构:

{
    "type":"temperature",
    "date":"1472528116698",
    "value":"35",
    "device":"device1"
}

类型属性可以是温度、纬度、经度。

那么你需要一些视图。就个人而言,我更喜欢按type的_design文档,这样查询起来也更容易。

例如,您将有一个像这样的 _design 文档用于温度:

{
   "_id": "_design/temperature",
   "_rev": "8-91e594df623063ed3ad7111cde09eecb",
   "language": "javascript",
   "views": {
       "byDevice": {
           "map": "function(doc) {\n    if ((doc.type + '').toLowerCase() === 'temperature' && doc.device)\n        emit(doc.device);\n}\n"
       },
       "lastestByDevice": {
           "map": "function(doc) {\n    if ((doc.type + '').toLowerCase() === 'temperature' && doc.device && doc.value)\n        emit(doc.device,doc.value);\n}\n",
           "reduce": "function(keys, values, rereduce) {\n    var max = Number.MIN_VALUE;\n    for (var i = 0; i < values.length; i++) {\n        var val = parseFloat(values[i]);\n        if (val > max)\n            max = val;\n    }\n    return max;\n}\n"
       }
   }
}

请求示例:

http://localhost:5984/db/_design/temperature/_view/latestByDevice?group_level=1&reduce=true

如果您通过 reduce 函数使用最新的设备,它将返回每个设备的最大值。我们这个例子,你应该可以有一个好的开始。我不知道您是如何接收和构建数据的,但如果您更喜欢按设备对所有内容进行分组,这也是可能的。

【讨论】:

  • 我实际上找到了一个类似的解决方案,将reduce函数实现为“保留最新度量”函数。然而,实现 reduce 函数被认为是一种“有问题的”做法,我希望有一个不需要这样做的解决方案
  • 使用不带reduce 函数的视图很遗憾似乎不是一个好主意,因为我在某处读到密钥作为字符串存储。因此,当需要对密钥进行排序时,我怀疑这是否可行,但我今晚可以试一试。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-03-10
  • 2017-04-13
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多