具有许多属性的UpdateItem

时间:2020-10-15 07:21:13

标签: go amazon-dynamodb aws-sdk insert-update

我正在尝试更新具有许多属性(超过100个)的项目。我可以看到有两种更新此项目的方法。

PutItem :根据我的理解,PutItem可以更新该项目,因为我正在使用struct来编组和解编请求数据,因此我需要为每个请求发送所有100个属性。如果我跳过任何字段,则默认值将插入表中。

UpdateItemInput :我们可以使用UpdateItemInput更新表,如下所示-

    svc := dynamodb.New(session.New())
    input := &dynamodb.UpdateItemInput{
    ExpressionAttributeNames: map[string]*string{
        "#AT": aws.String("AlbumTitle"),
        "#Y":  aws.String("Year"),
    },
    ExpressionAttributeValues: map[string]*dynamodb.AttributeValue{
        ":t": {
            S: aws.String("Louder Than Ever"),
        },
        ":y": {
            N: aws.String("2015"),
        },
    },
    Key: map[string]*dynamodb.AttributeValue{
        "Artist": {
            S: aws.String("Acme Band"),
        },
        "SongTitle": {
            S: aws.String("Happy Day"),
        },
    },
    ReturnValues:     aws.String("ALL_NEW"),
    TableName:        aws.String("Music"),
    UpdateExpression: aws.String("SET #Y = :y, #AT = :t"),
}

result, err := svc.UpdateItem(input)

在这里,我们需要为许多属性编写 ExpressionAttributeNames ,如果要更新的属性是动态的,我应该如何处理。

我不确定这是处理更新的有效方法。请建议哪种方法更好,或者还有其他方法可以解决这种情况。

1 个答案:

答案 0 :(得分:2)

您正确地PutItem 替换具有相同键的任何现有项目,因此,如果您只想合并一堆新的属性值到现有项目中,则需要使用UpdateItem

正如您所说,确实是使用UpdateExpression语法的一种选择。您需要创建一个像SET #a1 = :a1, SET #a2 = :a2, ...这样的字符串,并且还都设置了这些a1等,但这并不是那么困难的编程练习。

另一个选择是代替UpdateExpression,使用较旧的AttributeUpdates语法和一堆PUT操作。这也许稍微容易一些(您只构建一个JSON列表而不是一个表达式再加上两个列表),但是这两个过程实际上都需要一些简单的编程。

相关问题