web-dev-qa-db-ja.com

DynamoDB:updateItemは、すでに存在する場合のみ

デフォルトでは、指定されたインデックスを持つオブジェクトが存在しない場合、DynamoDBは新しいエントリを作成します。これを防ぐ方法はありますか?更新する前にテーブルのキーをクエリするだけでかまいませんが、1回のリクエストですべてを実行できると便利です。

17
Bananable

条件式id = :idを使用します。ここで、idは属性名(または、主キー名)であり、:idは値(更新するアイテムのキー)です。

条件式は常に書き込み前に評価されます。その式がtrueと評価されない場合(およびそのキーが存在しないか異なる場合は評価されません)、更新または新しいアイテムの配置は行われません。

13
Solo

重要な点は、ConditionExpressionは、実行している操作に応じて異なるデータセットで確認されることです PutItem または pdateItem

PutItem。

ConditionExpressionを設定すると、DynamoDBは任意のキー行の条件をチェックします-テーブルで範囲属性を使用する場合は多くの行、テーブルにハッシュのみを使用する場合は1行のみ。

DynamoDB PutItemオペレーションでは、渡すキーがすでに存在するかどうかを確認する必要があるため、ここで条件を確認するための追加費用はかかりません。

たとえば、customer_id/contact_emailキー定義を含むCUSTOMER_CONTACTSテーブルがあり、重複を作成したくない場合は、ConditionExpression = "#contact_email <> :email"を設定できます。その場合、指定されたハッシュ値に同じ電子メール(範囲属性)が使用されていると、PutItem操作はConditionalCheckFailedExceptionで失敗します。

ただし、ハッシュ行から離れた項目属性をチェックすることを期待しないでください。 DynamoDBが条件を確認するためだけにすべてのテーブルをスキャンするのは意味がありません。

アイテムを更新します。

前の例ConditionExpression = "#contact_email <> :email"と同じ条件を試すと、例外をトリガーすることなく、操作が常にオーバーライドされます。どうして? UpdateItemは1つの項目(キーで指定された項目)を見ているだけなので、.

UpdateItemを使用する場合、ConditionExpressionは1行のみを調べます。これは、設定する必要があるKey値で指定された行です。他のテーブル行の状態をチェックする方法はありません。

1
Nacho Coll

おそらくattribute_not_existsチェックインCondition Expressionsを探しています。

この条件式がPutItemで使用されると、DynamoDBは最初に、主キーが書き込まれるアイテムの主キーと一致するアイテムを探します。検索で何も返されない場合にのみ、結果にパーティションキーが存在しません。それ以外の場合、上記のattribute_not_exists関数は失敗し、書き込みは防止されます

詳細は http://docs.aws.Amazon.com/amazondynamodb/latest/developerguide/Expressions.SpecifyingConditions.html

0
Vor