我构建了一个定期发送MQTT消息的python脚本。
这是发送到后端的JSON字符串:
{"Id": "1234", "Ut": 1488395951, "Temp": 22.86, "Rh": 48.24}
在后端方面,我想将MQTT消息存储到DynamoDB表中。
我遵循了亚马逊教程,包含在MQTT消息中的数据存储在表中。
我的问题是关于表格列。
该表只有3个列:
可以在MQTT消息中包含每个密钥的列吗?
我会有这些专栏: - ID - 呃 - 温度 - Rh
感谢您的帮助!
答案 0 :(得分:1)
是的,你可以。
在DynamoDB中,您无需创建所谓的“列”。成功投放操作的唯一要求是您提供主要属性(在您的情况下为Id
和Ut
)。
来自docs:
属性名称/值对的映射,每个属性对应一个。只有 主键属性是必需的;你可以选择提供其他 该项的属性名称 - 值对。
在python中你可以做类似的事情(可能需要检查语法并调整列类型):
import boto3
client = boto3.client('dynamodb')
response = client.put_item(
TableName = 'Messages',
Item={
'Id': {
'S': '1234'
},
'Ut': {
'S': '1488395951'
},
'Temp': {
'S': '22.86'
},
'Rh': {
'S': '48.24'
}
}
)
答案 1 :(得分:1)
是的,当然。您可以为要存储在DynamoDB表中的任何内容创建列,而不是存储完整的有效负载。
按照步骤3.1:从this tutorial创建新项目,您需要更新put_item代码以包含所有商品详情......
#Parse your JSON message and get out all your attributes
id = message["Id"]
ut = message["Ut"]
temp = message["Temp"]
rh = message["Rh"]
response = table.put_item(
Item={
'id': id,
'ut': ut,
'temp': temp,
'rh': rh
}
)
现在,如果您在DynamoDB控制台中查看您的表,您将看到已为您的其他属性创建了新列。
答案 2 :(得分:1)
我假设您正在尝试在DynamoDB表中提供存储消息的IoT网关规则。遗憾的是,IoT规则不允许将数据存储在多个列中 - 您只能将有效负载(或其子集)存储在单个列中。目前没有规定将有效负载中的属性提取到几个不同的列中。
解决这个问题的唯一方法(我到目前为止找到的)是通过IoT规则调用lambda函数,该规则运行的代码与其他答案所显示的类似。
答案 3 :(得分:0)
是否可能在MQTT消息中包含每个键的列?
我要输入以下列:-ID-Ut-Temp-Rh
最简单,最简单的方法是使用AWS IoT DynamoDBv2操作,而无需实现Lambda。
来自https://docs.aws.amazon.com/iot/latest/developerguide/iot-rule-actions.html#dynamodb-v2-rule:
dynamoDBv2操作允许您将MQTT消息的全部或部分写入DynamoDB表。有效负载中的每个属性都被写入DynamoDB数据库的单独列中。
MQTT消息有效负载必须包含一个与表的主分区键匹配的根级密钥,以及一个与表的主排序键匹配的根级密钥(如果已定义)。
该表可以继续将Id
作为分区键,并将Ut
作为排序键。 MQTT消息已经包含分区和排序键,因此AWS IoT SQL语句可以简单地是:
SELECT * FROM 'mytopic'