ドキュメントクライアントの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;
}