LoginSignup
7
11

More than 5 years have passed since last update.

DynamoDBに複数項目を追加する

Last updated at Posted at 2019-02-10

備忘録としてまとめます。

はじめに

複数項目の追加をputとbatchWriteの2パターンの方法でやってみました。
AWS.DynamoDB.DocumentClientを使用します。

飲み物テーブル(DRINK)に飲み物名(name)と値段(price)の項目を追加します。
サンプルコードは関数内での使用を想定したものです。

put を使う

forでまわして1件ずつ追加をします。

const aws = require('aws-sdk');
const docClient = new aws.DynamoDB.DocumentClient();

function put() {
    var promise = new Promise(function (resolve) {
        // 追加するアイテムたち
        var items = [
            { name: 'コーヒー', price: 230},
            { name: '紅茶', price: 230},
            { name: 'オレンジジュース', price: 210}
        ];

        // 1件ずつ追加する
        for (var i = 0; items.length > i; i++) {
            const params = {
                TableName: 'DRINK',
                Item: {
                    name: items[i].name,
                    price: items[i].price
                }
            };

            docClient.put(params, function (err, data) {
                if (err) {
                    console.log('[ERROR] ' + err);
                    resolve(null);
                } else {
                    resolve(data);
                }
            });
        }
    });
    return Promise.all([promise]);
}

batchWrite を使う

一度にたくさん追加できるbatchWrite さんです。

const aws = require('aws-sdk');
const docClient = new aws.DynamoDB.DocumentClient();

function put() {
    return new Promise(function (resolve) {
        // 追加するアイテムたち
        var items = [
            { name: 'コーヒー', price: 230},
            { name: '紅茶', price: 230},
            { name: 'オレンジジュース', price: 210}
        ];

        // 追加する項目のオブジェクト生成
        var putRequest= [];
        items.forEach(function (item) {
            let obj= {
                PutRequest: {
                    Item: item
                }
            };
            putRequest.push(obj);
        });

        // テーブルの指定・追加項目をセット
        var params = {
            RequestItems: {
                DRINK: putRequest
            }
        };

        docClient.batchWrite(params, function (err, data) {
            if (err) {
                console.log('[ERROR] ' + err);
                resolve(null);
            } else {
                resolve(data);
            }
        });
    });
}

リクエスト構文(batchWriteに渡すparameterの部分)は以下です。


var param = {
    RequestItems: {
        "テーブル名": [
            {
                PutRequest: {
                    Item: {
                        "項目名1": "",
                        "項目名2": ""
                    }
                }
            },
            {
                PutRequest: {
                    Item: {
                        "項目名1": "",
                        "項目名2": ""
                    }
                }
            }
        ]
    }
 }
余談:batchWrite 失敗時

スループットによる追加失敗時はUnprocessedItemsにエラーデータ(未処理データ)が入ります。
項目名の指定ミスなどは追加前に拒否をされるためUnprocessedItemsではなくValidationExceptionとしてエラーに入ります。

感想

batchWrite の存在を知らずに無理くり put をしていましたが、とても便利ですね。
25件以上の追加エラーではUnprocessedItemsに入ると思ったのですが、でてきたのはValidationExceptionでした。大量追加の方法は使う機会ができたら調べてみようと思います。

7
11
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
7
11