DynamoDBに保存しているデータに対して更新する処理を作る際に詰まったので軽くまとめました。
ざっくり実装
booksテーブルに保存されているデータのうち、特定のauthorIdとcreatedAtに一致するデータのcontent情報を更新したいとする
'use strict';constAWS=require("aws-sdk");constdynamoDb=newAWS.DynamoDB({apiVersion:'2012-08-10'});consttableName="books";constqueryParams=(authorId,createdAt,content)=>{return{TableName:tableName,Key:{// 更新対象のデータを絞るための条件を指定'authorId':{S:authorId},// Primary partition key どうも型の指定が必要らしい'createdAt':{N:String(createdAt)}// Primary sort key どうも型の指定が必要らしい},// setで更新対象のkeyを指定する。 この場合、contentに入っているデータを、引数で渡されたもので更新するUpdateExpression:'set content = :content',ExpressionAttributeValues:{':content':{S:content},// どうも型の指定が必要らしい},ReturnValues:"UPDATED_NEW"};};// ファイル名がcreatedAt_startAt_endAt.mp4という命名でexports.handler=(event,context,callback)=>{const[authorId,createdAt,content]=event.resources;// eventからデータが取れると仮定constparams=queryParams(authorId,createdAt,content);dynamoDb.updateItem(params,(err,dynamoData)=>{if(err){console.log(JSON.stringify(err));}else{console.log(dynamoData);// 更新した結果が出力される}callback(null,);});};
注意点
- 対象のデータを検索するには
Primary partition key
とPrimary sort key
しか使えないっぽい- その他のKeyでfilterするのは無理っぽそう
- 検索パラメータのKeyやExpressionAttributeValuesのvalueは実際に格納しているデータの型(Number, Stringなど)を指定する必要があるっぽい
- queryするときのフィルタ条件ではそういう必要はなかったと思うので、割とややこしい