在DynamoDB表项中的List类型属性中添加或删除条目

时间:2015-02-01 02:04:17

标签: list amazon-web-services amazon-dynamodb

我有一个非常简单的类,带有字符串类型主键和List类型属性。我想编写APIS来添加和删除属性列表中的项目并将更改保存回DDB。

我能想到的最简单的解决方案是:       - 阅读清单(如果存在)       - 如果存在,请从“列表类型”属性中删除或添加该条目       - 将修改后的对象放回去

有没有更简洁的方法通过DynamoDB java API执行此操作?在我在这里发布这个问题之前,我花了很长时间来查找它。

4 个答案:

答案 0 :(得分:12)

接受的答案不正确,DynamoDB UpdateExpression documentation

中列出了正确的方法

您需要阅读列表然后获取您要删除的项目的索引,然后以REMOVE list[index]

运行UpdateExpression

答案 1 :(得分:3)

您可以使用SET运算符在属性列表中添加元素。但是为此,您必须先检索现有列表,然后在列表中添加新元素。假设您有一个名为active_user的属性,其中包含活动用户列表。

previous_list = "#a"
query = "SET %s = list_append(%s, :new_user)" % (previous_list, previous_list)
user_table.update_item(
    Key={
        # primary key
    },
    UpdateExpression=query,
    ExpressionAttributeNames={
        '#a': 'active_user',
    },
    ExpressionAttributeValues={
        ':new_user': new_user_model
    }
)

您可以使用REMOVE运算符删除或删除列表中的元素。但是您必须找到元素的索引,因为REMOVE运算符会删除列表的给定索引。

#user_index is the position of the target user in the list

query = "REMOVE active_user[%d]" % (user_index)
user_table.update_item(
    Key={
        # primary key
    },
    UpdateExpression=query
)

这里是REMOVE运算符docSET运算符doc

答案 2 :(得分:0)

DELETE操作仅支持在其文档中编写的Set数据类型。正确的答案可以在这个stackoverflow问题中找到

How to Remove from List Of Maps in DynamoDB (Must be Atomic)

答案 3 :(得分:-8)

我刚刚完全阅读了UpdateItem API,其中讨论了删除集类型属性:

  

DELETE - 如果没有为DELETE指定值,则删除属性及其值。指定值的数据类型必须与现有值的数据类型匹配。如果指定了一组值,则从旧集合中减去这些值。例如,如果属性值是集合[a,b,c]并且DELETE操作指定[a,c],则最终属性值为[b]。指定空集是一个错误。