具有许多属性的UpdateItem

问题描述

我正在尝试更新具有许多属性(超过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 ,如果要更新的属性是动态的,我应该如何处理。

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

解决方法

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

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

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