默认情况下,如果具有指定索引的对象不存在,DynamoDB将创建一个新条目。有没有办法阻止这种情况发生?我可以在更新前查询表中的密钥,但在一个请求中完成所有操作会很好。
答案 0 :(得分:5)
使用条件表达式id = :id
,其中id
是属性名称(或您的主键名称),:id
是值(您要更新的项目的键)。
在写入之前始终会评估条件表达式。如果该表达式未评估为true
(并且如果该密钥不存在或不同,则表示不存在),则它不会更新或放置新项目。
答案 1 :(得分:1)
关键点是ConditionExpression
会根据您正在执行的操作PutItem在不同的数据集上进行审核
或UpdateItem。
<强> PutItem。强>
当设置ConditionExpression
时,DynamoDB将检查您在任何Key行上的条件 - 如果在表上使用range属性则为多行,如果仅对表使用散列,则为1。
记住DynamoDB PutItem操作必须检查您传递的密钥是否已经存在,因此在此处检查您的状况不需要额外费用。
例如,如果您有一个带有customer_id / contact_email密钥定义的CUSTOMER_CONTACTS表,并且不想创建重复项,则可以设置ConditionExpression = "#contact_email <> :email"
。在这种情况下,如果将相同的电子邮件(范围属性)用于指定的哈希值,则PutItem操作将失败,并带有ConditionalCheckFailedException。
但是不要期望检查远离哈希行的项属性。 DynamoDB没有任何意义来扫描所有表只是为了检查你的状况。
更新项目。
如果您尝试的条件与前面的示例ConditionExpression = "#contact_email <> :email"
相同,则操作始终会覆盖而不会触发异常。为什么?因为UpdateItem只是查看一个项目,即您的密钥指定的项目。
使用UpdateItem时,ConditionExpression将仅查看1行,即您必须设置的Key值指定的行。无法检查任何其他表格行的状况。
答案 2 :(得分:1)
为了给出 Solo 答案的更具体示例,以下是用于更新项目的 CLI 命令,该项目使用条件表达式来确保在执行更新之前该行存在。
如果使用的 ID 不存在,这会阻止 DynamoDB 创建新记录。
aws dynamodb update-item \
--table-name ProductCatalog \
--key '{"Id": {"N": "456"}}' \
--update-expression "SET Price = :price" \
--condition-expression "id = :id" \
--expression-attribute-values file://values.json
带有包含以下内容的 values.json:
{
":price": { "N": "75"},
":id": {"N": "456"}
}
答案 3 :(得分:0)
您可能正在attribute_not_exists
查找Condition Expressions
。
当此条件表达式与PutItem一起使用时,DynamoDB首先查找其主键与要写入的项的主键匹配的项。仅当搜索没有返回任何内容时,结果中才会出现分区键。否则,上面的attribute_not_exists函数失败并且将阻止写入