#go #amazon-dynamodb #aws-sdk #insert-update
#Вперед #amazon-dynamodb #aws-sdk #вставить-обновить
Вопрос:
Я пытаюсь обновить элемент, который имеет много атрибутов (более 100). Я вижу, что есть два способа обновить этот элемент.
PutItem: PutItem может обновлять элемент, насколько я понимаю, мне нужно отправлять все 100 атрибутов для каждого запроса, потому что я использую struct для маршалинга и демарширования данных запроса. Если я пропущу какое-либо поле, в таблицу будет вставлено значение по умолчанию.
UpdateItemInput: мы можем обновить таблицу, используя UpdateItemInput следующим образом —
svc := dynamodb.New(session.New())
input := amp;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:
Вы правы в том, что a PutItem
заменяет любой существующий элемент с тем же ключом, поэтому, если вы хотите объединить только кучу новых значений атрибутов в существующий элемент, вам нужно использовать UpdateItem
.
Один из вариантов действительно, как вы сказали, использовать UpdateExpression
синтаксис. Вам нужно будет создать строку, подобную SET #a1 = :a1, SET #a2 = :a2, ...
, а также установить все эти a1 и т. Д., Но это не такое сложное упражнение по программированию.
Другой вариант — вместо UpdateExpression
этого использовать более старый AttributeUpdates
синтаксис с кучей PUT
операций. Возможно, это немного проще (вы создаете только один список JSON вместо выражения плюс два списка), но оба действительно требуют немного простого программирования.
Комментарии:
1. Спасибо за ответ. Я просто пытался узнать, является ли это стандартным подходом, или у нас также есть что-то в Golang, похожее на DynamoDB.DocumentClient() в node js, чтобы немного упростить задачу.