AWS

【DynamoDB】AWS SDK を使用した項目の更新

前回は項目の追加を行いました。

前回は以下を参照して下さい。

今回は項目の更新を行います。

項目の更新

項目の更新には updateItem メソッドを使用します。
updateItemは、プライマリキーを指定して実行します。
updateItemは、更新するテーブルの項目に一致するプライマリキーの値が存在するかしないかで、以下のように処理が異なります。

・一致するプライマリキーの値が存在しない場合、項目を新規追加します。
・一致するプライマリキーの値が存在する場合、プライマリキーの値に一致する項目を更新します。

なお、updateItemはプライマリキーの更新は行えません。
属性の追加、更新、削除を行います。

テーブルの内容

テーブルの情報は以下の通りです。

テーブル名: Musics
パーテションキー: “artist”
ソートキー: “title”

以下のように、プライマリキーのみで構成される項目が存在するものとします。
“artist” の値: “B’z”
“title” の値: “GREEN”

属性の追加

“sngsCnt” という属性を追加します。

実行

const DynamoDbSetter = require("./DynamoDbSetter");
 
module.exports = class DynamoDbOperator extends DynamoDbSetter{
 
    async exec(event) {
 
        // 実行内容
        let params = {
            TableName : "Musics",
            Key:{ 
                "artist": {"S":"B'z"},
                "title": {"S": "GREEN"},
            },
            UpdateExpression: "SET #sngsCnt= :sngsCntValue",
            ExpressionAttributeNames: {
                "#sngsCnt": "sngsCnt",
            },
            ExpressionAttributeValues: {
                ":sngsCntValue": {"N": "12"},
            },
            ReturnValues: "ALL_NEW",
            ReturnConsumedCapacity: "INDEXES"
        };
    
        // 実行
        return await this.dynamodb.updateItem(params).promise();
 
    }
}

実行内容の説明

Key

Keyには更新したい項目のプライマリキーを指定して下さい。

UpdateExpression

更新したい属性を指定します。
“#~” は キー名のプレースホルダーになります。
“:~” は 値のプレースホルダーになります。
プレースホルダーを使用するのは、キー名、値にDynamoDBの予約語が使用される場合に正常に動作しないからです。
予約語と被らなければプレースホルダーを使用する必要はありませんが、プレースホルダーを使用する方がエラーがなく実行できるのでプレースホルダーを使いましょう。

DynamoDBの予約語については以下を参照して下さい。

ExpressionAttributeNames

“#~” で指定した実際のキー名になります。

ExpressionAttributeValues

“:~” で指定した実際の値になります。

ReturnValues

putItem 同様 updateItem も ReturnValues を指定できます。
putItem の ReturnValues は “ALL_OLD” のみ指定できますが、
updateItem は以下の指定が可能です。また、項目の更新、追加により返却される値が異なります。

ALL_OLD

・項目が追加される場合、何も返却されません。
・項目が更新される場合、更新前の項目の内容が返却されます。

ALL_NEW

・項目の更新も追加も同様に、追加、更新される項目の内容が返却されます。

UPDATED_OLD

・項目が追加される場合、何も返却されません。
・項目が更新される場合、更新された属性の更新前の内容が返却されます。

UPDATED_NEW

・項目の更新も追加も同様に、更新された属性の更新後の内容が返却されます。

ReturnConsumedCapacity

putItemで説明したものと同様です。

結果

{
    "Attributes": {
        "artist": {
            "S": "B'z"
        },
        "sngsCnt": {
            "N": "12"
        },
        "title": {
            "S": "GREEN"
        }
    },
    "ConsumedCapacity": {
        "TableName": "Musics",
        "CapacityUnits": 1,
        "Table": {
            "CapacityUnits": 1
        }
    }
}

属性の更新

追加した属性 “sngsCnt” の値を更新します。

実行

const DynamoDbSetter = require("./DynamoDbSetter");
 
module.exports = class DynamoDbOperator extends DynamoDbSetter{
 
    async exec(event) {
 
        // 実行内容
        let params = {
            TableName : "Musics",
            Key:{ 
                "artist": {"S":"B'z"},
                "title": {"S": "GREEN"},
            },
            UpdateExpression: "SET #sngsCnt= :sngsCntValue",
            ExpressionAttributeNames: {
                "#sngsCnt": "sngsCnt",
            },
            ExpressionAttributeValues: {
                ":sngsCntValue": {"N": "20"},
            },
            ReturnValues: "ALL_NEW",
            ReturnConsumedCapacity: "INDEXES"
        };
    
        // 実行
        return await this.dynamodb.updateItem(params).promise();
 
    }
}

結果

{
    "Attributes": {
        "artist": {
            "S": "B'z"
        },
        "sngsCnt": {
            "N": "20"
        },
        "title": {
            "S": "GREEN"
        }
    },
    "ConsumedCapacity": {
        "TableName": "Musics",
        "CapacityUnits": 1,
        "Table": {
            "CapacityUnits": 1
        }
    }
}

最後に

次回は項目を取得します。

© DeNnie.Lab All Rights Reserved.