2017-03-01 168 views
2

我構建了一個定期發送MQTT消息的python腳本。AWS將MQTT消息存儲到DynamoDB

這是發送給後端的JSON字符串:

{"Id": "1234", "Ut": 1488395951, "Temp": 22.86, "Rh": 48.24} 

在後端的一面,我想存儲MQTT消息到DynamoDB表。

我遵循亞馬遜教程,包含在MQTT消息中的數據存儲在表中。

我的問題是關於表列。

表僅有3 colums:

  • 編號:分區鍵
  • UT:排序關鍵字
  • 有效載荷:包含MQTT消息。

MQTT消息中包含的每個密鑰都可能有列嗎?

我想有這樣的列: - 標識 - UT - 溫度 - 銠

感謝您的幫助!

+0

你有固定的屬性或屬性可以非常動態嗎?在這兩種情況下,都可以分別存儲屬性。但是,您可能需要解析json並相應地設置值。 – notionquest

+0

需要我調用解析json並將數據存儲到dynamoDB的lambda函數?謝謝 – Federico

回答

1

是的,你可以。

在DynamoDB中,您不需要創建所謂的「列」。成功投放操作的唯一要求是您提供主要屬性(在您的案例中IdUt)。

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' 
     } 
    } 
) 
+0

感謝您的回覆。我忘了提及消息推送是由規則自動觸發到AWS IoT控制檯中的。我的python腳本將MQTT消息發送到AWS MQTT代理。是否可以配置此規則來分割數據? – Federico

1

是的,當然。您可以爲要存儲在DynamoDB表中的任何內容創建列,而不是或除了存儲完整的有效內容之外。

以下步驟3.1:從this tutorial創建新項目,如果您在DynamoDB控制檯看看你的表,你會更新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 
    } 
) 

現在,你會看到爲您的其他屬性創建了新列。

0

我假設您正在嘗試將您的消息存儲在DynamoDB表中的IoT網關規則。不幸的是,IoT規則不允許將數據存儲在多個列中 - 您只能將有效負載(或其子集)存儲在單個列中。目前沒有規定將有效載荷中的屬性提取到多個不同的列中。

解決此問題的唯一方法(我迄今爲止找到的)是調用一個lambda函數,該函數的運行代碼類似於其他答案顯示的代碼。