はじめに
AWS SDK for JavaScript v3 で DynamoDB を扱う記事が少ない印象なのでメモ程度に書きなぐっておきます。
公式のサンプル実装もあり、見たのですが、改めて見返すのはちょっと……という抵抗感を感じてしまったので、本当に個人的に最小限メモしておきたいものだけ記載しています。
DynamoDB のテーブルアイテム操作
テーブル設定
設定項目 | 値 |
---|---|
テーブル名 | Music |
パーティションキー | Artist |
ソートキー | SongTitle |
データ一括操作
一括で追加
BatchWriteCommand
(API名としては BatchWriteItem
)で最大一括で25件追加が出来る。
25件を超えてしまうなら、事前に以下実装のようにファイルの分割を実施する必要がある。
import { DynamoDBClient } from "@aws-sdk/client-dynamodb";
import { DynamoDBDocumentClient, BatchWriteCommand } from "@aws-sdk/lib-dynamodb";
const client = new DynamoDBClient({});
const docClient = DynamoDBDocumentClient.from(client);
const list = [
['Perfume', 1, '2005-09-21', 'リニアモーターガール'],
['Perfume', 2, '2006-01-11', 'コンピューターシティ'],
['Perfume', 3, '2006-06-28', 'エレクトロ・ワールド'],
['Perfume', 4, '2007-02-14', 'ファン・サーヴィス[sweet]'],
['Perfume', 5, '2007-09-12', 'ポリリズム'],
['Perfume', 6, '2008-01-16', 'Baby cruising Love'],
['Perfume', 6, '2008-01-16', 'マカロニ'],
['Perfume', 7, '2008-07-09', 'love the world'],
['Perfume', 8, '2008-11-19', 'Dream Fighter'],
['Perfume', 9, '2009-03-25', 'ワンルーム・ディスコ'],
['Perfume', 10, '2010-04-14', '不自然なガール'],
['Perfume', 10, '2010-04-14', 'ナチュラルに恋して'],
['Perfume', 11, '2010-08-11', 'VOICE'],
['Perfume', 12, '2010-11-10', 'ねぇ'],
['Perfume', 13, '2011-05-18', 'レーザービーム'],
['Perfume', 13, '2011-05-18', '微かなカオリ'],
['Perfume', 14, '2011-11-02', 'スパイス']];
const chunks = <T>(arrayData: Array<T>, chunkSize: number = 25): Array<Array<T>> =>
Array.from({ length: Math.ceil(arrayData.length / chunkSize) }, (_, i) =>
arrayData.slice(i * chunkSize, i * chunkSize + chunkSize));
const commands = chunks(list, 25).map(chunk => {
const command = new BatchWriteCommand({
RequestItems: {
Music: chunk.map(item => ({
PutRequest: {
Item: {
Artist: item[0],
SongTitle: item[3],
Release: item[2],
Numeric: item[1]
}
}
})),
},
});
return docClient.send(command);
});
Promise.all(commands)
.then(console.log);
一括で削除
以下の差分を適応することでBatchWriteCommand
(API名としては BatchWriteItem
)で最大一括で25件削除も出来る。
パーティションキーとソートキー以外の属性は渡さないようにする必要があるので注意。
- PutRequest: {
- Item: {
+ DeleteRequest: {
+ Key: {
Artist: item[0],
SongTitle: item[3],
- Release: item[2],
- Numeric: item[1]
}
}