我正在使用DynamoDb适配器进行alexa技能。FYI,我对开发非常陌生,所以如果这个问题很愚蠢,我道歉。
from ask_sdk_dynamodb.adapter import DynamoDbAdapter
我在dynamodb中有一个像这样嵌套的持久属性。至少这是我最初保存到属性中的内容。
enqueue_data = {
"ENQUEUE": [
{
"link_enqueue": "http://link1.com",
"offset_in_milliseconds_enqueue": "numerical value",
"title": "title 1"
},
{
"link_enqueue": "http://link2.com",
"offset_in_milliseconds_enqueue": "numerical value",
"title": "title 2"
}
]
}
但在dynamodb中,格式如下所示。这是它的一部分的快照。
{ "link" : { "S" : "http://link1.com" },{ "ENQUEUE" : { "L" : [ { "M" : { "title_enqueue" : { "S" : "Title 1" }, "link_enqueue" : { "S" : "http://link1.com" }, "offset_in_milliseconds_enqueue" : { "N" : "15645" } } }, { "M" : { "title_enqueue" : { "S" : "title 2" }, "link_enqueue" : { "S" : "http://link2.com" }, "offset_in_milliseconds_enqueue" : { "N" : "52546" } } }
首先,我使用this从属性中获取selected_link变量值,这非常有效。
#selected_link = http://link1.com
selected_link = attr['link']
我有以下代码。我正在尝试迭代我在dynamodb中拥有的东西;
1.查找ENQUEUE键值是否存在
1.如果存在,则迭代link_enqueue值,直到它与selected_link变量匹配
1.如果匹配,则更新不同的键值。
示例:如果selected_link为http://link1.com,则在ENQUEUE中查找http://link1.com,如果是,则将offset_in_milliseconds_enqueue更新为新值
def handle(self, handler_input):
offset_in_milliseconds = '3232'
#getting the attribute from dynamodb
attr = handler_input.attributes_manager.persistent_attributes
#getting link value
selected_link = attr['link']
# Check if 'ENQUEUE' key exists in persistent attributes
if 'ENQUEUE' in attr:
enqueue_data = attr['ENQUEUE']
# Check if 'link_enqueue' is present in any item within 'ENQUEUE'
relevant_items = [item for item in enqueue_data.values() if item.get('link_enqueue') == selected_link]
if relevant_items:
relevant_item = relevant_items[0]
# Assuming you want the first relevant item
relevant_item['offset_in_milliseconds_enqueue'] = offset_in_milliseconds
# Save the updated persistent attributes
handler_input.attributes_manager.save_persistent_attributes()
return
return
return
理想情况下,新属性应该在offset_in_milliseconds_enqueue中具有新值,因为selected_link匹配link_enqueue。其他一切都应该保持不变。
enqueue_data = {
"ENQUEUE": [
{
"link_enqueue": "http://link1.com",
"offset_in_milliseconds_enqueue": "new numerical value",
"title": "title 1"
},
{
"link_enqueue": "http://link2.com",
"offset_in_milliseconds_enqueue": "numerical value",
"title": "title 2"
}
]
}
1条答案
按热度按时间n3ipq98p1#
克服DynamoDB-JSON复杂性的最佳方法是反序列化为标准JSON。您可以从内置的Boto 3实用程序轻松完成此操作。
快速阅读这篇博客应该可以让你轻松地处理JSON,并使你的更新逻辑更容易:
https://aws.amazon.com/blogs/database/exploring-amazon-dynamodb-sdk-clients/