我正在尝试更新一个具有许多属性(超过 100 个)的项目。我可以看到有两种方法可以更新此项目。
PutItem:PutItem 可以更新项目,根据我的理解,我需要为每个请求发送所有 100 个属性,因为我使用结构来编码(marshal)和解封请求数据。如果我跳过任何字段,默认值将插入到表中。
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 列表,而不是一个表达式加两个列表),但这两者都需要一些简单的编程。
关于go - 具有许多属性的 UpdateItem,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64366670/