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

DynamoDB のレコード削除操作で IndexName を指定することはできない = GSI で消すことはできない
DynamoDB では、delete 操作において IndexName を直接指定することはできません。これは、GSI(グローバルセカンダリインデックス)はデータの検索を高速化するための補助的なインデックスであり、データの削除はプライマリキーで行う必要があるためです。
GSI を使用したデータの削除方法
GSI でデータ削除を行うには、以下の手順を踏む必要があります。
- GSI でのクエリ: 削除対象のデータの GSI パーティションキーとソートキーを使用して
query操作を行います。 - プライマリキーの取得:
queryの結果から、削除対象のデータのプライマリキー(ハッシュキーとレンジキー)を取得します。 - プライマリキーによる削除: 取得したプライマリキーを使用して
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 操作を実行する必要があります。


