问题描述
我正在尝试更新具有许多属性(超过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列表而不是一个表达式再加上两个列表),但是这两个过程实际上都需要一些简单的编程。