couchdb/cloudant时间序列查询

couchdb/cloudant时间序列查询,couchdb,time-series,cloudant,Couchdb,Time Series,Cloudant,我有一个cloudant数据库,其中包含来自多个设备的度量值集合。 每台设备都发送许多测量值,但有三个是感兴趣的:温度、纬度和经度。 由于系统的设计,每个值都是一个单独的度量值(我无法在插入时轻松加入温度、纬度和经度),在数据库中我有一组度量值,如下所示: { "device": "foo", "name": "temperature", "date": <timestamp>, "value": <value> }, { "device": "foo

我有一个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>
},
{
“设备”:“foo”,
“名称”:“温度”,
“日期”:,
“价值”:
},
{
“设备”:“foo”,
“名称”:“纬度”,
“日期”:,
“价值”:
},
{
“设备”:“foo”,
“名称”:“经度”,
“日期”:,
“价值”:
},
从概念上讲,我有3个时间序列。 我想提取每个时间序列的最新的度量值,理想情况下按设备对它们进行分组

比如:

{
  device1: {
    "temperature": {
      date: <date>,
      value: <value>
    },
    "latitude": {
      date: <date>,
      value: <value>
    },
   "longitude": {
      date: <date>,
      value: <value>
   }
  },
  "device2": {
    ...
  }
}
{
设备1:{
“温度”:{
日期:,
价值:
},
“纬度”:{
日期:,
价值:
},
“经度”:{
日期:,
价值:
}
},
“设备2”:{
...
}
}
我并不期望使用这种确切的语法,这只是我所期望的数据集的一个概念


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

首先,我将使用如下数据结构:

{
    "type":"temperature",
    "date":"1472528116698",
    "value":"35",
    "device":"device1"
}
类型属性可以是温度、纬度和经度

然后你需要一些视图。就我个人而言,我更喜欢按类型创建一个设计文档,这样查询也会更容易

例如,对于温度,您将有一个_设计文档,如下所示:

{
   "_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"
       }
   }
}
{
“_id”:“_设计/温度”,
“修订版”:“8-91e594df623063ed3ad7111cde09eecb”,
“语言”:“javascript”,
“意见”:{
“byDevice”:{
“映射”:“函数(doc){\n如果((doc.type+'').toLowerCase()==='temperature'&&doc.device)\n发出(doc.device);\n}\n”
},
“lastestByDevice”:{
“映射”:“函数(doc){\n如果((doc.type+'').toLowerCase()=='temperature'&&doc.device&&doc.value)\n发出(doc.device,doc.value);\n}\n”,
“reduce”:“函数(键、值、返回值){\n var max=Number.MIN\u VALUE;\n for(var i=0;imax)\n max=val;\n}\n返回max;\n}\n”
}
}
}
请求示例:


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

可以肯定的是,最后一个ts代表最后一个时间戳?不,我指的是按日期输入的最后一个时间序列条目(大致相同),以及我回答您的问题之前的最后一个问题,即“日期”每个测量的条目对于一个条目中的每个值不是相同的吗?它不应该是:{u id:“123909012”,“device1:{“纬度”:“经度”:“温度”:“}”,device2:{“纬度”:“经度”:“温度”:“}}}不,每个值的日期可能不同。我实际上找到了一个类似的解决方案,将reduce函数作为“保留最新度量值”功能。但是,它被认为是“有问题的”“练习实现reduce函数,我希望有一个解决方案不需要使用视图而不使用reduce函数,不幸的是,这不是一个好主意,因为我在某个地方读到密钥存储为字符串。所以到了整理钥匙的时候,我怀疑这是否有效,但今晚我可以试试。