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

List 在DynamoDB表项的列表类型属性中添加或删除条目,list,amazon-web-services,amazon-dynamodb,List,Amazon Web Services,Amazon Dynamodb,我有一个非常简单的类,带有字符串类型的主键和列表类型的属性。我想编写一个API,用于从属性列表中添加和删除项,并将更改保存回DDB 我能想到的最简单的解决方案是: 阅读列表(如果存在) 如果该项存在,请从“列表类型”属性中删除或添加该项 将修改过的对象放回原处 是否有一种更干净/更简单的方法通过DynamoDB java API实现这一点?我刚刚彻底阅读了UpdateItem API,其中谈到删除集合类型属性: 删除-如果没有为删除指定值,则删除属性及其值。指定值的数据类型必须与现有值的数据类型

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

我能想到的最简单的解决方案是:

  • 阅读列表(如果存在)
  • 如果该项存在,请从“列表类型”属性中删除或添加该项
  • 将修改过的对象放回原处

  • 是否有一种更干净/更简单的方法通过DynamoDB java API实现这一点?

    我刚刚彻底阅读了UpdateItem API,其中谈到删除集合类型属性:

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


    接受的答案不正确,正确的方法列在


    您需要阅读列表,然后获取要删除的项的索引,然后运行
    remove list[index]
    ,作为
    UpdateExpression

    您可以使用
    SET
    操作符在属性列表中添加元素。但为此,您必须首先检索现有列表,然后在列表中追加新元素。假设您有一个名为
    active\u 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
    )
    

    这里是
    删除
    运算符和
    设置
    运算符。

    请描述您正在寻找的更简单的方法:)@ErbenMo我想知道是否可以使用UpdateExpression。但我只是彻底阅读了文档,以及delete如何使用一组类型属性。我看到我现有的阅读、删除和更新方法是我唯一的选择。现在将结束问题。您知道要删除的项目的索引吗,或者您可以改为通过某个识别键映射项目吗?在步骤2中,“it”听起来像是指1中的列表,对吗?嗯,如果不知道我在上述评论中问到的细节,OP的问题就无法真正得到回答,谢谢。这对列表类型有什么帮助?问题是关于列表类型的。这个答案是关于集合类型的。这不应该是可接受的答案。您也可以使用
    DELETE
    。拥有
    colors=[“red”,“blue”]
    DELETE colors:color
    :color=“blue”
    将按预期工作。在PHP中的工作示例中,我正在阅读dynamodb文档的链接,假设我有一个数据列表[1,2],两个用户都希望删除列表中的第一个数字,并且都将使用列表[0]更新DELETE要删除数字“1”,其中一个将删除正确的数字,第二个将删除数字“2”。我们如何确保只删除我们要删除的内容,而不删除任何不存在的内容?通常,对于关系数据库,我会使用id,但这里没有。您应该使用ConditionExpression来防止其他人同时更改数据。Delete only适用于集合,对于列表,唯一的选项是Remove为什么说“您必须先检索现有列表”?
    SET
    不是写操作吗?您提到的“检索”的读取操作在哪里?(还有,这是什么语言?我个人就是认不出来,谢谢)。不管怎样,在这个答案的下半部分,+1代表
    REMOVE