Ban*_*ble 13 php amazon-web-services amazon-dynamodb
默认情况下,如果不存在具有指定索引的对象,DynamoDB将创建一个新条目.有没有办法阻止这种情况发生?我可以在更新之前查询表中的密钥,但是在一个请求中完成所有操作会很好.
Sol*_*olo 12
使用条件表达式id = :id
,其中id
是属性名称(或您的情况下的主键名称),:id
是值(您要更新的项目的键)。
条件表达式始终在任何编写之前进行求值。如果该表达式的计算结果不为该值true
(如果该键不存在或不同,则为零),它不会更新或放置新项。
关键是ConditionExpression
根据您正在执行的操作PutItem
或UpdateItem在不同的数据集上进行审查。
放置项。
设置ConditionExpression
DynamoDB 时,将检查您对任何关键行的条件 - 如果在表上使用范围属性,则为多行,如果仅对表使用哈希,则为 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 行,即由您必须设置的键值指定的行。无法在任何其他表格行上检查您的状况。
为了给出 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)
您可能正在寻找attribute_not_exists
入住Condition Expressions
。
当此条件表达式与 PutItem 一起使用时,DynamoDB 首先查找主键与要写入的项目的主键匹配的项目。仅当搜索未返回任何内容时,结果中才不存在分区键。否则,上面的 attribute_not_exists 函数会失败并且写入将被阻止