DynamoDB:updateItem仅在已存在的情况下

时间:2016-07-23 06:08:00

标签: php amazon-web-services amazon-dynamodb

默认情况下,如果具有指定索引的对象不存在,DynamoDB将创建一个新条目。有没有办法阻止这种情况发生?我可以在更新前查询表中的密钥,但在一个请求中完成所有操作会很好。

4 个答案:

答案 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函数失败并且将阻止写入

更多http://docs.aws.amazon.com/amazondynamodb/latest/developerguide/Expressions.SpecifyingConditions.html