AWS

【DynamoDB】AWS SDK を使用した項目の追加

前回はテーブルの作成を行いました。

今回はテーブルへ項目を作成します。
また、DynamoDBの基本的な構成要素(テーブル、項目、属性)については知っている事とします。
知らない方は以下を参考にして下さい。

項目の追加(putItemの説明)

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

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

テーブルの内容

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

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

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

項目の追加

指定するパラメータの説明は次項以降で説明しますが、今回はついでに、ReturnValues、ReturnConsumedCapacity を指定し、どのような結果が返ってくるか確認します。
ReturnValues、ReturnConsumedCapacity を指定しなくても項目の追加は行えますので、戻り値の指定は適宜指定して下さい。

プライマリキー属性のみ追加

プライマリキー属性のみ指定します。

実行

const DynamoDbSetter = require("./DynamoDbSetter");

module.exports = class DynamoDbOperator extends DynamoDbSetter{

    async exec(event) {

        // 実行内容
        let params = {
            TableName : "Musics",
            Item:{ 
                "artist": {"S":"B'z"},
                "title": {"S": "GREEN"},
            },
            ReturnValues: "ALL_OLD",
            ReturnConsumedCapacity: "INDEXES"
        };
    
        // 実行
        return await this.dynamodb.putItem(params).promise();

    }
}

実行内容の説明

Item

Item には追加したい項目のプライマリキーを指定して下さい。

ReturnValues

ReturnValues を指定すると putItem の戻り値は以下の情報を返却します。
なお、ReturnValues は “ALL_OLD” が指定できます。
項目の追加と更新により戻り値が異なります。
なお、戻り値の指定は任意です。

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

ReturnConsumedCapacity

ReturnConsumedCapacity を指定すると putItem の戻り値は消費されるキャパシティユニットに関する情報を返却します。
なお、ReturnConsumedCapacity は以下が指定できます。指定する内容によって返却される内容が異なります。

・TOTAL:消費された書き込みキャパシティユニットの総数を返します。
・INDEXES:消費された書き込みキャパシティユニットの総数と、テーブルおよびオペレーションに影響を受けたセカンダリインデックスの小計を返します。
・NONE:書き込み容量の詳細は返されません。(これがデフォルトです)

キャパシティユニットについては以下を参照して下さい。

結果

{
    "ConsumedCapacity": {
        "TableName": "Musics",
        "CapacityUnits": 1,
        "Table": {
            "CapacityUnits": 1
        }
    }
}

プライマリキー属性とプライマリキー以外の属性の追加

プライマリキー以外の属性を追加します。”year”という数値属性を追加します。

実行

const DynamoDbSetter = require("./DynamoDbSetter");

module.exports = class DynamoDbOperator extends DynamoDbSetter{

    async exec() {

        // 実行内容
        let params = {
            TableName : "Musics",
            Item:{ 
                "artist": {"S":"YUI"},
                "title": {"S": "GREEN GARDEN POP"},
                "year": {"N": "2021"},
            },
            ReturnValues: "ALL_OLD",
            ReturnConsumedCapacity: "INDEXES"
        };
    
        // 実行
        return await this.dynamodb.putItem(params).promise();

    }
}

結果

{
    "ConsumedCapacity": {
        "TableName": "Musics",
        "CapacityUnits": 1,
        "Table": {
            "CapacityUnits": 1
        }
    }
}

属性へ異なるタイプの値を追加

DynamoDBはプライマリキー以外はスキーマレスです。プライマリキー以外の属性について、異なるデータタイプを追加するとどうなるでしょうか。
先ほど追加した属性 “year” は数値属性です。これに文字列を追加したらどうなるでしょうか。
結果は エラーなく “year” には文字列が追加されます。

実行

const DynamoDbSetter = require("./DynamoDbSetter");

module.exports = class DynamoDbOperator extends DynamoDbSetter{

    async exec() {

        // 実行内容
        let params = {
            TableName : "Musics",
            Item:{ 
                "artist": {"S":"B'z"},
                "title": {"S": "IN THE LIFE"},
                "year": {"S": "Lock"},
            },
            ReturnValues: "ALL_OLD",
            ReturnConsumedCapacity: "INDEXES"
        };
    
        // 実行
        return await this.dynamodb.putItem(params).promise();

    }
}

このように、属性には異なるデータタイプが指定できますが不都合が生じる可能性があるため、やらない事をお勧めします。
後に “year” 属性を使用して項目を取得したい場合にできなくなります。
正確には異なるデータタイプの属性についてグローバルセカンダリインデックスを作成できないからです。
グローバルセカンダリインデックスは以下を参照して下さい。

項目の更新

putItemを実行する際に、テーブルに存在するプライマリキーの値を指定するとその項目を更新します。
ただし、プライマリキーの値を更新する事はできません。
プライマリキー以外の属性とその値の追加、更新が行えます。
今回も戻り値の指定は適宜行って下さい。

プライマリキー以外の属性の追加

以下のプライマリキーについて新たな属性 “genre” を追加します。

パーテションキー: “artist” 値は “B’z”
ソートキー: “title” 値は “IN THE LIFE”

実行

const DynamoDbSetter = require("./DynamoDbSetter");

module.exports = class DynamoDbOperator extends DynamoDbSetter{

    async exec(event) {

        // 実行内容
        let params = {
            TableName : "Musics",
            Item:{ 
                "artist": {"S":"B'z"},
                "title": {"S": "IN THE LIFE"},
                "genre": {"S": "OF THE LOCK"},
            },
            ReturnValues: "ALL_OLD",
            ReturnConsumedCapacity: "INDEXES"
        };
    
        // 実行
        return await this.dynamodb.putItem(params).promise();

    }
}

結果

{
    "Attributes": {
        "year": {
            "S": "Lock"
        },
        "artist": {
            "S": "B'z"
        },
        "title": {
            "S": "IN THE LIFE"
        }
    },
    "ConsumedCapacity": {
        "TableName": "Musics",
        "CapacityUnits": 1,
        "Table": {
            "CapacityUnits": 1
        }
    }
}

プライマリキー以外の属性の更新

先ほどは、属性 “genre” が追加されました。今回はこの属性の値を更新します。

実行

const DynamoDbSetter = require("./DynamoDbSetter");

module.exports = class DynamoDbOperator extends DynamoDbSetter{

    async exec(event) {

        // 実行内容
        let params = {
            TableName : "Musics",
            Item:{ 
                "artist": {"S":"B'z"},
                "title": {"S": "IN THE LIFE"},
                "genre": {"S": "Lock"},
            },
            ReturnValues: "ALL_OLD",
            ReturnConsumedCapacity: "INDEXES"
        };
    
        // 実行
        return await this.dynamodb.putItem(params).promise();

    }
}

結果

{
    "Attributes": {
        "year": {
            "S": "Lock"
        },
        "artist": {
            "S": "B'z"
        },
        "genre": {
            "S": "OF THE LOCK"
        },
        "title": {
            "S": "IN THE LIFE"
        }
    },
    "ConsumedCapacity": {
        "TableName": "Musics",
        "CapacityUnits": 1,
        "Table": {
            "CapacityUnits": 1
        }
    }
}

最後に

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

© DeNnie.Lab All Rights Reserved.