DynamoDB:如何将值附加到现有Item的List(Array)中

时间:2018-05-22 04:15:29

标签: amazon-dynamodb aws-php-sdk

(我正在使用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中?

1 个答案:

答案 0 :(得分:1)

Add elements to the list

使用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])。