(我正在使用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'
];
我可以通过这种方式以某种方式APPEND新值(又名)添加新评论。但这实际上仍在重新创建整个项目,这不是我喜欢的方式。
我如何只是简单地将新值附加到现有项目中的List / Array中?
答案 0 :(得分: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]
)。