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

(я использую 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'
];

Iможет каким-то образом ПРИЛОЖИТЬ новые значения (aka) добавить новый комментарий , таким образом.Но это буквально по-прежнему воссоздание всего целого элемента снова, что я не предпочел.

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

1 Ответ

0 голосов
/ 22 мая 2018

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

Когда вы используете 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]).

...