Обновить элемент со многими атрибутами

#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, чтобы немного упростить задачу.