【问题标题】:如何使用 update_item 和 Boto3 在 DynamoDB 列表中的索引处插入项目
【发布时间】:2022-01-23 13:17:48
【问题描述】:

我有一个简单的 DynamoDB 表结构:

{
 id: '123_456',
 number_list: ['a', 'c']
}

我想在这个数组的中间(或某个特定索引处)添加'b'

据我所知,我们可以使用list_append()在末尾添加如:

table.update_item(
 Key={'id': '123_456'},
 UpdateExpression="SET number_list = list_append(number_list, :nl)"
 ExpressionAttributeValues={ ':nl': ['b'] }
)

这将导致['a', 'c', 'b'],但我想要['a', 'b', 'c']

有没有办法实现这一点,或者我应该获取存储的列表,在 python 中的索引处添加并再次存储:

SET list_number = :nln
{ ':nln': ['a', 'b', 'c'] }

我知道我们可以使用REMOVE list_number[1] 在索引处删除,这将导致['a']。我想找到类似的东西。

非常感谢。

【问题讨论】:

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


    【解决方案1】:

    您可以从旧列表构建新列表 - 如果您确切知道应该在哪里进行更改。 Here 是一个示例 - 搜索“附加到列表并同时更新特定值”。从那我会尝试:

    UpdateExpression=f"SET #nl[1] = :repl",
    ExpressionAttributeNames={
        "#nl": "number_list",
    },
    ExpressionAttributeValues={
        ":repl": "b"
    },
    

    更新(评论后)

    上面的代码会将“c”更改为“b”。所以["a","b"],而不是["a","b","c"]。我个人的解决方案是制作整个列表并更新它。另一方面,更新表达式可以有更多的操作,如:

    UpdateExpression=f"SET #nl[2]=#nl[1], #nl[1]=:repl",
    

    如果有很多元素 - 而不是 3 个元素,也许有人会这样做。在这种情况下 - 将它们全部移动一个......是有问题的。在那种情况下,我会使用list_append:

    UpdateExpression=f"SET #nl = list_append(#nl[0], #nl), #nl[1]=:repl",
    

    【讨论】:

    • 谢谢,但这会将 number_list[1] 替换为 b,我们将拥有 ['a', 'b']?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-04-25
    • 1970-01-01
    • 1970-01-01
    • 2023-03-21
    • 1970-01-01
    • 2018-09-24
    • 2019-10-09
    相关资源
    最近更新 更多