Dynamoの面倒なルール
1レコード削除ではなく一つの項目のデータのみを削除したい場合、updateで空文字を指定して更新しようと思うが、Dynamoは空文字を指定できない。
半角スペースを入れてアップデートはできるが、それだとデータが存在していることになるし、
半角スペースで文字列比較してチェックするのもちょっと良くない。
項目のみを削除する方法、ググってもなかなか出てこなくて大変だった。
普通に1レコードを削除する方法
テーブル名とハッシュ値を指定してdeleteする
const deleteHogeTableParams = {
TableName: 'hogeTable',
Key: {
id: '114514',
},
}
await documentClient.delete(deleteHogeTableParams).promise()
項目のみを削除
このように、普通のupdate()ではなく「transactWrite()」使って、
「UpdateExpression: 'Remove #hd, #nd'」って感じで項目を指定してRemoveする。
const deleteHogeTableParams = {
TransactItems: [
{
Update: {
TableName: 'hogeTable',
Key: {
id: '114514',
},
ExpressionAttributeNames: {
'#hd': 'hogeDate',
'#nd': 'nazonazoDate',
},
UpdateExpression: 'Remove #hd, #nd',
},
},
],
await documentClient.transactWrite(deleteHogeTableParams).promise()
感想
マジでDymano使っててなんもいいことない。MySQLだったら一瞬で出来ることを、Dynamoだと便利な機能が少ないし制限がひどすぎるし、ちょっとしたことでもわりと複雑な設定しなくてはならない。。。
データ取得するとき、必ずハッシュ値指定しなきゃいけないとか意味わからん。他のカラム(属性)を条件にしたかったらグローバルセカンダリーインデックスの設定ファイルを書かなきゃいけなかったり。。。
AWS使ってるけどMySQLでええやん。。。(業務の愚痴)