步骤 1. 准备好 Cloudant 数据存储在这一步中,将会让 Poseidon Cloudant 数据库中的传感器读数可以采用客户端使用的某种格式。更具体地讲,要让数据可用于客户端应用程序,以便创建一个图表,显示某个特殊传感器的最后 x 天值得一读的温度、湿度和压力值。
存储在数据库中每一个传感器读数现在都具有以下格式:
1
2
3
4
| {"_id":"f15b90c35ac432034b7d08d628f204f9","_rev":"2-9d58792b0ad4e39116572ac811a2d509",
"temperature":21.74,"timestamp":"2014-09-11T20:49:03.950070",
"altitude":167703.6,"clientID":"ExamplePlantSensor",
"pressure":1021.52,"longitude":4.8,"moisture":699,"latitude":50.2}
|
默认情况下,所有读数都是通过其 ID(_id)进行分类的。您要做的第一件事就是在 Cloudant 中创建一个新的视图,通过使用传感器名称和时间戳的组合键对数据进行分类。然后,可以查找某个特定传感器和时间范围。
- 查找主机名\用户名和您的 Cloudant 实例的密码:
- 登录到 。
- 在仪表板中,单击您在本教程系列的 中创建的应用程序的图标。
- 选择 SDK for Node.js(在左边)。
- 您可以看到针对 Bluemix 实例中的服务的环境变量。(可能需要花费一段时间来加载它们。)这些变量包含您在本教程中需要使用的 Cloudant 主机名、用户 ID 和密码:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
| {
"name": "MyPoseidon3:cloudantNoSQLDB",
"label": "cloudantNoSQLDB",
"plan": "Shared",
"credentials": {
"username": "f8fe0075-9b65-49c5-bffd-b67c1fe16260-bluemix",
"password": "11111111111111111111111111111b456b35bd2e609740ae54f83602",
"host": "f8fe0075-9b65-49c5-bffd-b67c1fe16260-bluemix.cloudant.com",
"port": 443,
"url": "https://f8fe0075-9b65-49c5-bffd-b67c1fe16260-bluemix:
801e32c10276a103abb374284d34a9bdfad91b456b35bd2e609740ae54f83602@f8fe0075-9b65-
49c5-bffd-b67c1fe16260-bluemix.cloudant.com"
}
}
|
在一个您可以轻松进行复制/粘贴的文件中保存此代码。
- 在 Cloudant 中创建一个历史视图:
- 在 Bluemix 实例仪表板中,选择您的 Cloudant 服务。
- 单击 Launch 为您的 Cloudant 实例加载管理用户界面。
- 单击 poseidonsensors。
- 单击 All Design Docs 旁边的 +,并选择 New View:

- 填充 New View 表单: Cloudant 中的视图采用了 MapReduce 概念来构建视图索引。关于构建您自己的自定义视图的更多信息,请参阅 CouchDB 文档中的 。
- 对于 Save to Design Document,可以选择 New document。
- 在 _/design 字段中,输入 sensors。
- 对于索引名称,可以输入 history。
- 选择可选 Reduce 字段中的 None。
- 在 Map function 字段中,输入以下内容:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
| function(doc) {
if(doc.clientID && doc.timestamp) {
sensor_values = [0, 0, 0];
if (doc.temperature) {
sensor_values[0] = doc.temperature;
}
if (doc.moisture) {
sensor_values[1] = doc.moisture;
}
if (doc.pressure) {
sensor_values[2] = doc.pressure;
}
emit([doc.clientID, doc.timestamp], sensor_values);
}
}
|
- 单击 Save & Build index:
 - 通过浏览以下内容来测试您的新视图: https://host/poseidonsensors/_design/sensors/_view/history
例如:https://f8fe0075-9b65-49c5-bffd-b67c1fe16260-bluemix.cloudant.com/poseidonsensors/_design/sensors/_view/history)。
您必须在后续步骤 1d 中提供用户名和密码。(在步骤 2 中,可以将此数据作为开放数据提供,从而不必提供用户名和密码。)
此请求将返回所有文档:

- 通过提供一个起始和结束时间,您可以使用 startkey 和 endkey 参数来限制列表。URL 的结构如下所示: https://host/poseidonsensors/_design/sensors/_view/history?startkey=[sensor_id, datetime]&endkey=[sensor_id,datetime]
例如: https://f8fe0075-9b65-49c5-bffd- ... w/history?startkey=["BramPlantSensor", "2014-10-10T00:00:00.000000"]&endkey=["BramPlantSensor", "2014-11-10T00:00:00.000000"] - 注销 Cloudant 并重新登录,以便刷新 Cloudant 管理用户界面。现在,可以在 Views 列表中看到新的 history 视图:
 - history 视图将会返回创建一个图表所需的所有数据,但您可以将这些数据转换成逗号分隔值 (CSV) 格式(通过使用 ),让数据变得更紧凑:
- 单击 Cloudant 管理界面中的 All Design Docs。
- 单击 Edit 来编辑您在这一步中创建的设计文档。
- 将以下代码添加到设计文档中,立即对 history 视图使用以下代码:
1
2
3
4
5
6
| "lists" : {
"csv" : "function(head, req){ start({ 'headers': { 'Content-Type': 'text/csv' } });
send('timestamp,temperature,moisture,pressure\\u000A'); while(row = getRow()){
send(row.key[1] + ',' + row.value[0] + ',' + row.value[1] + ',' + row.value[2] +
'\\u000A'); } }"
}
|
- 作为一种替代方法(不想现在就做到这一点),您可以在不使用管理界面的情况下重新提交整个设计文档(包括 history 和 lists 视图)。在编辑模式下,在克隆的 PoseidonProject 存储库打开 Tutorial3/Cloudant/creating_views.json。将版本号(_rev)更改为类似于 Cloudant 中的当前设计文档的编号(让 Cloudant 知道您正在更新以前的版本)。上传文件:curl -X PUT https://host/poseidonsensors/_design/sensors --data-binary @sensors_design.json。Cloudant 会使用结果值和所创建设计文档的版本号来进行响应。
在您的浏览器中使用以下 URL 结构来测试新的 lists 视图:
https://host/poseidonsensors/_design/sensors/_list/csv/history?startkey=[sensor_id, datetime]&endkey=[sensor_id,datetime] 例如: https://f8fe0075-9b65-49c5-bffd- ... v/history?startkey=["BramPlantSensor", "2014-10-10T00:00:00.000000"]&endkey=["BramPlantSensor", "2014-11-10T00:00:00.000000"]
URL 返回了一个包含传感器读数的 CSV 文件:  这就是这一步中的操作。您已经完成了数据存储的准备工作。 |