【问题标题】:Boto3 DynamoDB is it possible to do update_item on a list of objectsBoto3 DynamoDB 是否可以在对象列表上执行 update_item
【发布时间】:2021-02-10 02:12:18
【问题描述】:

我有一个按用户 id 排序的表,每个对象都包含一个对象列表,这些对象具有自己的 id 和两个属性。是否可以使用 update_item 来更新其中任一属性,使用 user_id 和 obj_id。我发现的唯一方法是使用 GET 然后 PUT,感觉可能会更昂贵。

这是我表中的示例条目:

{'id': '0',
 'commands': [{'id': '0', 'command': '', actions: []}, {'id': '1', 'command': '', actions: []}]
}

假设我想在 user_id 0 上更新 id 为 0 的命令以获得不同的操作列表,我想我可以这样做:

table = dynamodb.Table('commands')
user_id = '0'
command_id = '0'
document = table.get_item(Key={"id": user_id})['Item']
for command in document['commands']:
    if command['id'] == command_id:
        command['actions'] = ['new actions']
        break
table.put(Item=document, ReturnValues="NONE")    

但是有没有一种方法可以更有效地使用 update_item 呢?

我可以在文档中找到的唯一内容是在表达式中使用 list_append,但我不想附加要编辑现有项目的新项目。

我找到了这两个问题作为参考,第一个是我上面的解决方案,但是我在这里问的问题没有得到回答,我可以使用 update_item 来做吗?

Boto3 DynamoDB update list attributes for an item

How to append a value to list attribute on AWS DynamoDB?

【问题讨论】:

    标签: python amazon-web-services amazon-dynamodb boto3


    【解决方案1】:

    就相关文档而言,目前还没有BatchUpdate API 可用。

    我只能看到这个BatchWriteItem,它适用于put和delete

    BatchWriteItem 操作在一个或多个表中放置或删除多个项目。对 BatchWriteItem 的一次调用可以写入多达 16 MB 的数据,其中可以包含多达 25 个放置或删除请求。要写入的单个项目可以大到 400 KB。

    BatchWriteItem 无法更新项目。要更新项目,请使用 UpdateItem 操作。

    【讨论】:

    • 谢谢,所以我的解决方案似乎是最合适的?
    • @jbflow 我没有看到任何其他选项。您已经考虑到目前可用的 API。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-11-06
    • 2022-01-23
    • 2016-04-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多