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

use*_*840 5 list amazon-web-services amazon-dynamodb

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

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

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

csi*_*ilk 14

接受的答案不正确,DynamoDB UpdateExpression文档中列出了正确的方法

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

  • DELETE 仅适用于集合,对于列表,唯一的选项是 REMOVE (4认同)
  • 您也可以使用`DELETE`。具有`colors = [“ red”,“ blue”]`,`Delete colors:color`和`:color =“ blue”`可以正常工作。 (2认同)
  • 我正在阅读 dynamodb 文档的链接,假设我有一个数据列表 [1,2] 和两个用户,他们都想删除列表中的第一个数字,并且都将使用列表 [0] 更新删除删除数字“1”,其中一个将删除正确的数字,第二个将删除数字“2”我们如何确保只删除我们想要删除的内容,而不删除任何内容?通常与关系数据库我会使用 id,但在这里我们没有任何 (2认同)
  • 您应该使用 ConditionExpression 来防止其他人同时更改数据 (2认同)

Sha*_*uza 6

您可以使用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
    }
)
Run Code Online (Sandbox Code Playgroud)

您可以使用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
)
Run Code Online (Sandbox Code Playgroud)

这是REMOVEoperator docSEToperator doc


use*_*840 -14

我刚刚彻底阅读了 UpdateItem API,其中讨论了删除设置类型属性:

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

  • 这个问题具体是关于列表类型的。这个答案是关于集合类型的。这不应该是公认的答案。 (11认同)
  • 这对列表类型有什么帮助? (2认同)