ドキュメントクライアントのBatchWriteItemコマンドの使い方。 BatchWriteItem コマンドでは、データの保存と削除ができます。
参考
書き込み(PutRequests)
書き込みでは、BatchWriteCommandInput型を以下のようにします。
{ RequestItems: { "テーブル名": [ { PutRequest: { Item: { 保存データ }, }, }, ... ] } }
保存データは、キーバリュー形式になります。 パーティションキーは必須になります。 ソートキーを設定している場合はソートキーも必要になります。
例 PutRequestのサンプル
async function docBatchWriteItemPut() { const tableName = getTableName(); const params: BatchWriteCommandInput = { RequestItems: { [tableName]: [ { PutRequest: { Item: { pk: '2024-10', sk: '2024-10-01' }, }, }, { PutRequest: { Item: { pk: '2024-10', sk: '2024-10-02' }, }, }, { PutRequest: { Item: { pk: '2024-10', sk: '2024-10-03' }, }, }, ] }, }; const command = new BatchWriteCommand(params); const res = await docClient.send(command); console.log("docBatchWriteItemPut: %o", res); return res; }
削除(DeleteRequests)
削除では、BatchWriteCommandInput型を以下のようにします。
{ RequestItems: { "テーブル名": [ { DeleteRequest: { Key: { 削除データ}, }, }, ... ] } }
削除データの指定は、キーバリュー形式になります。 パーティションキーは必須になります。 ソートキーを設定している場合はソートキーも必要になります。
例
async function docBatchWriteItemPut() { const tableName = getTableName(); const params: BatchWriteCommandInput = { RequestItems: { [tableName]: [ { DeleteRequest: { Key: { pk: '2024-10', sk: '2024-10-02' }, }, }, ... ] }, }; const command = new BatchWriteCommand(params); const res = await docClient.send(command); console.log("docBatchWriteItemDelete: %o", res); return res; }
制限
BatchWriteCommandには制限があり、書き込みと削除で1度に25個以上の指定はできないことです。
参考
そのためデータが多い場合、BatchWriteCommandはデータの分割処理が必要になります。 AWSのサンプルでは、以下のchunkArray関数が使われているので、これを使って分割します。
function* chunkArray<T>(arr: T[], stride = 1) { for (let i = 0; i < arr.length; i += stride) { yield arr.slice(i, Math.min(i + stride, arr.length)); } }
参照
分割書き込み
例
async function docBatchWriteItemPut(start: Date, end: Date) { const items = getItems(start, end); const putRequests = items.map((v) => ({ PutRequest: { Item: { pk: v.pk, sk: v.sk } } })); const result = []; const tableName = getTableName(); const list = chunkArray(putRequests, 25); for (const chunk of list) { const params: BatchWriteCommandInput = { RequestItems: { [tableName]: chunk, }, }; const command = new BatchWriteCommand(params); const res = await docClient.send(command); result.push(res); } console.log("docBatchWriteItemPut: %o", result); return result; }
分割削除
例
async function docBatchWriteItemDelete(start: Date, end: Date) { const items = getItems(start, end); const deleteRequests = items.map((v) => ({ DeleteRequest: { Key: { pk: v.pk, sk: v.sk } } })); const result = []; const tableName = getTableName(); const list = chunkArray(deleteRequests, 25); for (const chunk of list) { const params: BatchWriteCommandInput = { RequestItems: { [tableName]: chunk, }, }; const command = new BatchWriteCommand(params); const res = await docClient.send(command); result.push(res); } console.log("docBatchWriteItemDelete: %o", result); return result; }