首页 > 解决方案 > 在 Python 中更新 DynomoDB 中的嵌套 JSON 结构

问题描述

我无法弄清楚如何使用 DynamoDB 和 Python 更新嵌套的 JSON 表。

我能够得到一些简单的工作,但现在我需要在我的数据库模式中有更深的嵌套结构,我无法弄清楚。

当“电话”属性值匹配(例如“+14086272826”)时,有人可以告诉我如何更新“alarm_log”列表吗?该表的键是“twilio_number”。

{
  "twilio_number": "+18342388712",
  "user_numbers": [
    {
      "alarm_log": [{
                        "date_sent": "10-20-19",
                        "alarm_type": "234",
                        "alarm_sms_sid": "SID32342352",
                        "acknowledged": "yes"
                    }],
      "phone": "+14086272826"
    },
    {
      "alarm_log": [{
                        "date_sent": "10-21-19",
                        "alarm_type": "534",
                        "alarm_sms_sid": "SID32342342352",
                        "acknowledged": "yes"
                    }],
      "phone": "+14082064826"
    }
  ]
}

在表的一个简单版本中,我使用此代码进行更新(将新数据附加到列表中),但使用新模式,我无法弄清楚如何更新与正确“电话”值匹配的正确“警报日志”。

UpdateExpression='SET alarm_log = list_append(alarm_log, :data_obj)',
            ExpressionAttributeValues={
                ":data_obj": [
                        {
                            'date_sent': date_sent,
                            'alarm_type': alarm_type,
                            'alarm_sms_sid': alarm_sms_sid,
                            'acknowledged': 'yes'
                        }
                ]
            }

谢谢你的帮助!

标签: pythonjsonamazon-dynamodb

解决方案


如果您希望在一个请求中更新多个记录,则 dynamo 不支持。

如果您希望在一个请求中添加多条记录,请使用最多可以添加 25 个项目的batchwriteItem 。

如果要更新现有记录,请使用updateItem。与您的情况一样,您必须单独更新项目。

正如您所提到的,表的键是“twilio_number”。如果这是表的唯一键,则所有更新 alarm_log 的请求都将覆盖一个条目,并且在所有更新之后您将只有一项。

您可以根据电话号码创建范围/排序键(带有分区键 {twilio_number} + sort_key {phone_number} 的复合主键)。在更新时提供这些键来更新项目请求。

确保 twilio_number + phone_number 对于项目是唯一的,否则它将覆盖现有条目。


推荐阅读