DynamoDB: 削除時にIndexName(GSI)は指定できない!GSIでレコードを削除するには?

  • 2024-09-10
DynamoDB: 削除時にIndexName(GSI)は指定できない!GSIでレコードを削除するには?

DynamoDB のレコード削除操作で IndexName を指定することはできない = GSI で消すことはできない

DynamoDB では、delete 操作において IndexName を直接指定することはできません。これは、GSI(グローバルセカンダリインデックス)はデータの検索を高速化するための補助的なインデックスであり、データの削除はプライマリキーで行う必要があるためです。

GSI を使用したデータの削除方法

GSI でデータ削除を行うには、以下の手順を踏む必要があります。

  1. GSI でのクエリ: 削除対象のデータの GSI パーティションキーとソートキーを使用して query 操作を行います。
  2. プライマリキーの取得: query の結果から、削除対象のデータのプライマリキー(ハッシュキーとレンジキー)を取得します。
  3. プライマリキーによる削除: 取得したプライマリキーを使用して delete 操作を行います。

コード例

const AWS = require('aws-sdk');
const documentClient = new AWS.DynamoDB.DocumentClient();

// GSI でのクエリ
const params = {
  TableName: 'your-table-name',
  IndexName: 'your-gsi-name', // GSI の名前を指定
  KeyConditionExpression: '#name = :name',
  ExpressionAttributeNames: {
    '#name': 'name' // GSI パーティションキーの名前
  },
  ExpressionAttributeValues: {
    ':name': 'dada' // 削除対象のデータの GSI パーティションキーの値
  }
};

documentClient.query(params, (err, data) => {
  if (err) {
    console.error('Query error:', err);
  } else {
    // プライマリキーを取得
    const itemsToDelete = data.Items.map(item => ({
      DeleteRequest: {
        Key: {
          // プライマリキーの値を指定
          'hashKey': item.hashKey, // ハッシュキー
          'rangeKey': item.rangeKey // レンジキー
        }
      }
    }));

    // プライマリキーによる削除 (BatchWriteItem を使用する)
    const batchWriteParams = {
      RequestItems: {
        'your-table-name': itemsToDelete
      }
    };

    documentClient.batchWriteItem(batchWriteParams, (err, data) => {
      if (err) {
        console.error('BatchWriteItem error:', err);
      } else {
        console.log('Data deleted successfully.');
      }
    });
  }
});

注意点

  • delete 操作はプライマリキーを使用して行う必要があります。
  • BatchWriteItem を使用して複数のアイテムを同時に削除することができます。
  • GSI のクエリ結果に複数のアイテムが含まれる場合、それぞれを delete 操作する必要があります。

まとめ

DynamoDB の delete 操作では、IndexName を指定することはできません。GSI でデータ削除を行うには、GSI でクエリを行い、プライマリキーを取得して delete 操作を実行する必要があります。