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
操作を実行する必要があります。