JavaScript
Node.js
AWS
DynamoDB

DynamoDBに複数項目を追加する

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


はじめに

複数項目の追加を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でした。大量追加の方法は使う機会ができたら調べてみようと思います。