【AWS/DynamoDB】知っておきたい知識 - updateItem(更新)編

DynamoDBの項目の作成(putItem)で必要な知識についてはこちらをご参照ください。

bonoponz.hatenablog.com

もくじ

UpdateItem オペレーション

更新する項目のキーを指定する必要があります。また、変更する属性を示す更新式と、その式に割り当てる値も指定する必要があります。

UpdateExpression、ExpressionAttributeNames、ExpressionAttributeValuesの3つをセットで使います。

UpdateExpression

UpdateExpressionにはデータをどう更新するのかを指定します。

  • SET: 値を上書きで保存する
  • REMOVE: Attributeそのものを消す
  • ADD: 数値の加減算したり、後述するセット型にデータを追加したりする
  • DELETE: セット型からデータを削除する
"UpdateExpression": "set 
  #title = :newTitle,
  #body = :newBody,
  #updatedTimestamp=:updatedTimestamp,
",

左辺の#xxx

左辺にある#xxxなど#で始まる変数が後述のExpressionAttributeNamesに連動します。

右辺の:xxx

右辺にある:xxxなど:で始める変数が後述のExpressionAttributeValuesに連動します。

ExpressionAttributeNames

ExpressionAttributeNamesをつかって、キーに別名を割り当てます。UpdateExpressionの#xxxの箇所です。

"ExpressionAttributeNames": {
  "#title": "title",
  "#body": "body",
  '#updatedTimestamp': 'updatedTimestamp',
},

ExpressionAttributeValues

ExpressionAttributeValuesをつかって、クエリの条件データの別名です。UpdateExpressionの:xxxの箇所です。

ExpressionAttributeValues: {
  ':newTitle': 'タイトル',
  ':newBody': '本文',
  ':updatedTimestamp': timestamp,
},

ConditionExpression

「条件付き書き込み」を行うことができます。値に指定した条件式を満たせば更新されます。

'ConditionExpression': '#updatedTimestamp < now()',

この場合、#updatedTimestampが現在時刻より前なら更新されます。(動作未確認)

ConditionExpressionでは演算子などを用います。

#a = :val
#a < :val
#a <= :val
#a > :val
#a >= :val
#a <> :val

書き込み条件式についてはこちらをご参照ください。

予約語は不可

ConditionExpressionを設定するとき、項目の属性名がDynamoDBの予約語と被らないようにする必要があります。

予約語については公式で確認しましょう。

これを回避するためには#xxxを別の名前に置換することで回避できるようです。

updateItem

最後にupdateItemして更新されます。

参考URL

DynamoDBでデータを更新する際に使うUpdateExpressionについて一通りまとめてみた | Developers.IO

【詳解】JavascriptでDynamoDBを操作する - Qiita

Python(Boto3)でDynamoDB上のデータの「アップサート」と「条件付き書き込み」を一度にできるのか確認してみた | Developers.IO