前回は項目の追加を行いました。
前回は以下を参照して下さい。
今回は項目の更新を行います。
項目の更新
項目の更新には updateItem メソッドを使用します。
updateItemは、プライマリキーを指定して実行します。
updateItemは、更新するテーブルの項目に一致するプライマリキーの値が存在するかしないかで、以下のように処理が異なります。
・一致するプライマリキーの値が存在しない場合、項目を新規追加します。
・一致するプライマリキーの値が存在する場合、プライマリキーの値に一致する項目を更新します。
なお、updateItemはプライマリキーの更新は行えません。
属性の追加、更新、削除を行います。
テーブルの内容
テーブルの情報は以下の通りです。
テーブル名: Musics
パーテションキー: “artist”
ソートキー: “title”
以下のように、プライマリキーのみで構成される項目が存在するものとします。
“artist” の値: “B’z”
“title” の値: “GREEN”
属性の追加
“sngsCnt” という属性を追加します。
実行
const DynamoDbSetter = require("./DynamoDbSetter");
module.exports = class DynamoDbOperator extends DynamoDbSetter{
async exec(event) {
// 実行内容
let params = {
TableName : "Musics",
Key:{
"artist": {"S":"B'z"},
"title": {"S": "GREEN"},
},
UpdateExpression: "SET #sngsCnt= :sngsCntValue",
ExpressionAttributeNames: {
"#sngsCnt": "sngsCnt",
},
ExpressionAttributeValues: {
":sngsCntValue": {"N": "12"},
},
ReturnValues: "ALL_NEW",
ReturnConsumedCapacity: "INDEXES"
};
// 実行
return await this.dynamodb.updateItem(params).promise();
}
}
実行内容の説明
Key
Keyには更新したい項目のプライマリキーを指定して下さい。
UpdateExpression
更新したい属性を指定します。
“#~” は キー名のプレースホルダーになります。
“:~” は 値のプレースホルダーになります。
プレースホルダーを使用するのは、キー名、値にDynamoDBの予約語が使用される場合に正常に動作しないからです。
予約語と被らなければプレースホルダーを使用する必要はありませんが、プレースホルダーを使用する方がエラーがなく実行できるのでプレースホルダーを使いましょう。
DynamoDBの予約語については以下を参照して下さい。
ExpressionAttributeNames
“#~” で指定した実際のキー名になります。
ExpressionAttributeValues
“:~” で指定した実際の値になります。
ReturnValues
putItem 同様 updateItem も ReturnValues を指定できます。
putItem の ReturnValues は “ALL_OLD” のみ指定できますが、
updateItem は以下の指定が可能です。また、項目の更新、追加により返却される値が異なります。
ALL_OLD
・項目が追加される場合、何も返却されません。
・項目が更新される場合、更新前の項目の内容が返却されます。
ALL_NEW
・項目の更新も追加も同様に、追加、更新される項目の内容が返却されます。
UPDATED_OLD
・項目が追加される場合、何も返却されません。
・項目が更新される場合、更新された属性の更新前の内容が返却されます。
UPDATED_NEW
・項目の更新も追加も同様に、更新された属性の更新後の内容が返却されます。
ReturnConsumedCapacity
putItemで説明したものと同様です。
結果
{
"Attributes": {
"artist": {
"S": "B'z"
},
"sngsCnt": {
"N": "12"
},
"title": {
"S": "GREEN"
}
},
"ConsumedCapacity": {
"TableName": "Musics",
"CapacityUnits": 1,
"Table": {
"CapacityUnits": 1
}
}
}
属性の更新
追加した属性 “sngsCnt” の値を更新します。
実行
const DynamoDbSetter = require("./DynamoDbSetter");
module.exports = class DynamoDbOperator extends DynamoDbSetter{
async exec(event) {
// 実行内容
let params = {
TableName : "Musics",
Key:{
"artist": {"S":"B'z"},
"title": {"S": "GREEN"},
},
UpdateExpression: "SET #sngsCnt= :sngsCntValue",
ExpressionAttributeNames: {
"#sngsCnt": "sngsCnt",
},
ExpressionAttributeValues: {
":sngsCntValue": {"N": "20"},
},
ReturnValues: "ALL_NEW",
ReturnConsumedCapacity: "INDEXES"
};
// 実行
return await this.dynamodb.updateItem(params).promise();
}
}
結果
{
"Attributes": {
"artist": {
"S": "B'z"
},
"sngsCnt": {
"N": "20"
},
"title": {
"S": "GREEN"
}
},
"ConsumedCapacity": {
"TableName": "Musics",
"CapacityUnits": 1,
"Table": {
"CapacityUnits": 1
}
}
}
最後に
次回は項目を取得します。