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

Ban*_*ble 13 php amazon-web-services amazon-dynamodb

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

Sol*_*olo 12

使用条件表达式id = :id,其中id是属性名称(或您的情况下的主键名称),:id是值(您要更新的项目的键)。

条件表达式始终在任何编写之前进行求值。如果该表达式的计算结果不为该值true(如果该键不存在或不同,则为零),它不会更新或放置新项。


Nac*_*oll 7

关键是ConditionExpression根据您正在执行的操作PutItemUpdateItem在不同的数据集上进行审查

放置项。

设置ConditionExpressionDynamoDB 时,将检查您对任何关键行的条件 - 如果在表上使用范围属性,则为多行,如果仅对表使用哈希,则为 1。

请记住,DynamoDB PutItem 操作必须检查您传递的 Key 是否已经存在,因此在此处检查您的条件不会产生额外费用。

例如,如果您有一个带有 customer_id/contact_email 键定义的 CUSTOMER_CONTACTS 表并且不想创建重复项,则可以设置ConditionExpression = "#contact_email <> :email". 在这种情况下,如果相同的电子邮件(范围属性)用于指定的哈希值,则 PutItem 操作将失败并出现 ConditionalCheckFailedException。

但是不要期望检查远离散列行的项目属性。DynamoDB 仅仅为了检查您的情况而扫描所有表是没有意义的。

更新项目。

如果您尝试与前一个示例相同的条件,ConditionExpression = "#contact_email <> :email"则操作始终覆盖而不触发异常。为什么?因为 UpdateItem 只查看 1 个项目,即您的 Key 指定的项目。

使用 UpdateItem 时,ConditionExpression 将只查看 1 行,即由您必须设置的键值指定的行。无法在任何其他表格行上检查您的状况。


JD *_*D D 5

为了给出 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
Run Code Online (Sandbox Code Playgroud)

value.json 包含以下内容:

{
    ":price": { "N": "75"},
    ":id": {"N": "456"}
}
Run Code Online (Sandbox Code Playgroud)


Vor*_*Vor 0

您可能正在寻找attribute_not_exists入住Condition Expressions

当此条件表达式与 PutItem 一起使用时,DynamoDB 首先查找主键与要写入的项目的主键匹配的项目。仅当搜索未返回任何内容时,结果中才不存在分区键。否则,上面的 attribute_not_exists 函数会失败并且写入将被阻止

更多信息请访问http://docs.aws.amazon.com/amazondynamodb/latest/developerguide/Expressions.SpecifyingConditions.html

  • 你是对的 Bananable,我尝试使用“attribute_exists”,它绝对不会阻止插入项目,因为它只检查一行是否具有特定属性。您找到解决方案了吗? (7认同)