DynamoDB: Как добавить значения в список (массив) существующего элемента

(Я использую AWS PHP SDK)

Допустим, у меня есть таблица:

Table name: article
Primary partition key: article_id (Number)

С образцом вручную созданного элемента:

{
    "article_id": 10010,
    "updated": "2018-02-22T20:15:19.28800Z",
    "comments": [ "Nice article!", "Thank you!" ]
}

Добавление нового комментария:

Я знаю, как полностью обновить (перезаписать) этот существующий элемент следующим образом:

$key = $marshaler->marshalJson('
    {
        "article_id": 10010
    }
');

$eav = $marshaler->marshalJson('
    {
        ":u": "2018-02-22T20:15:19.28800Z",
        ":c": [ "Nice article!", "Thank you!", "This is the new one!" ]
    }
');

$params = [
    'TableName' => 'article',
    'Key' => $key,
    'ExpressionAttributeValues'=> $eav,
    'UpdateExpression' => 'set updated=:u, comments=:c',
    'ReturnValues' => 'UPDATED_NEW'
];

Я могу как-то добавить новые значения (иначе) добавить новый комментарий, таким образом. Но это буквально все еще воссоздает весь Предмет снова, что я не предпочитал.

Как мне просто добавить новые значения в список / массив внутри существующего элемента, пожалуйста?

1 ответ

Добавить элементы в список

Когда вы используете SET для обновления элемента списка, содержимое этого элемента заменяется новыми данными, которые вы укажете. Если элемент еще не существует, SET добавит новый элемент в конец списка.

Создать таблицу

aws dynamodb create-table \
    --table-name article \
    --attribute-definitions AttributeName=article_id,AttributeType=N \
    --key-schema AttributeName=article_id,KeyType=HASH \
    --provisioned-throughput ReadCapacityUnits=1,WriteCapacityUnits=1

Добавьте предмет

aws dynamodb put-item  \
        --table-name article \
        --item '{
            "article_id": {"N": "123"},
            "updated": {"S": "00:00:00"},
            "comments": {
                  "L": [
                    { "S": "Nice article!" },
                    { "S": "Thank you!" }
                ]}
          }'

Обновить товар

aws dynamodb update-item \
    --table-name article \
    --key '{"article_id":{"N":"123"}}' \
    --update-expression "SET comments[50] = :c, updated=:u" \
    --expression-attribute-values '{
        ":u": {"S": "01:01:01"},
        ":c": {"S": "This is the new one!"}
      }' \
    --return-values ALL_NEW

Список comments[] содержат два элемента (индекс 0 и 1) до обновления. Как comments[50] не существует, операция SET добавит его в конец списка (comments[2]).

Другие вопросы по тегам