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