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]
).