本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。
AttributeUpdates
在 UpdateItem
操作中,AttributeUpdates
是要修改的属性的名称、每个属性要执行的操作以及每个属性的新值。如果要更新的属性是该表上任何索引的索引键属性,则属性类型必须与表描述的 AttributesDefinition
中定义的索引键类型匹配。您可以使用 UpdateItem
更新任何非键属性。
属性值不能为空。字符串和二进制类型属性的长度必须大于零。集类型属性不得为空。具有空值的请求将被拒绝,并显示 ValidationException
异常。
每个 AttributeUpdates
元素都包含要修改的属性名称以及以下内容:
-
Value
- 此属性的新值 (如果适用)。 -
Action
- 指定如何执行更新的值。此操作仅适用于数据类型为“数字”或“集合”的现有属性;请勿将ADD
用于其他数据类型。如果在表中找到具有指定主键的项目,则以下值将执行以下操作:
-
PUT
- 向项目添加指定属性。如果属性已存在,它会被替换为新值。 -
DELETE
- 如果未指定DELETE
的值,则删除该属性及其值。 指定值的数据类型必须与现有值的数据类型匹配。如果指定了一组值,则将从旧集合中减去这些值。例如,如果属性值是设置的
[a,b,c]
并且DELETE
操作指定[a,c]
,则最终属性值为[b]
。 指定空集是一个错误。 -
ADD
- 将指定的值添加到项目 (如果该属性尚不存在)。如果属性存在,则ADD
的行为取决于属性的数据类型:-
如果现有属性是数字,并且
Value
也是数字,则Value
按数学运算添加到现有属性。如果Value
为负数,则从现有属性中减去它。注意 如果您使用
ADD
增加或减少在更新之前不存在的项目的数字值,则 DynamoDB 使用 0 作为初始值。同样,如果对现有项目使用
ADD
以递增或递减在更新前不存在的属性值,则 DynamoDB 使用0
作为初始值。例如,假设您要更新的项目没有名为 itemcount 的属性,但您仍然决定ADD
该数字3
到此属性。DynamoDB 将创建 itemcount 属性,将其初始值设置为0
,最终向其中添加3
。结果将是一个新的 itemcount 属性,其值为3
。 -
如果现有数据类型是集合,并且
Value
也是集合,则Value
附加到现有集合。例如,如果属性值是设置的[1,2]
,并且ADD
操作指定了[3]
,则最终属性值为[1,2,3]
。 如果为集合属性指定了ADD
操作并且指定的属性类型与现有集合类型不匹配,则会出现错误。两个集合必须具有相同的基元数据类型。例如,如果现有数据类型是一组字符串,则
Value
也必须是一组字符串。
-
如果在表中未找到具有指定键的项目,则以下值将执行以下操作:
-
PUT
- 导致 DynamoDB 创建具有指定主键的新项目,然后添加属性。 -
DELETE
– 不会发生任何情况,因为无法从不存在的项目中删除属性。操作成功,但 DynamoDB 不创建新项目。 -
ADD
- 导致 DynamoDB 创建项目,其中包含为属性值提供的主键和数字(或数字集)。唯一允许的数据类型是数字和数字集。
-
如果您提供了作为索引键的一部分的任何属性,则这些属性的数据类型必须与表的属性定义中的架构的类型匹配。
使用 UpdateExpression 而不是
假设您要修改 Music 表中的项目。您可以将 UpdateItem
请求与 AttributeUpdates
参数结合使用,如以下 AWS CLI 示例所示:
aws dynamodb update-item \ --table-name Music \ --key '{ "SongTitle": {"S":"Call Me Today"}, "Artist": {"S":"No One You Know"} }' \ --attribute-updates '{ "Genre": { "Action": "PUT", "Value": {"S":"Rock"} } }'
但您可以使用 UpdateExpression
:
aws dynamodb update-item \ --table-name Music \ --key '{ "SongTitle": {"S":"Call Me Today"}, "Artist": {"S":"No One You Know"} }' \ --update-expression 'SET Genre = :g' \ --expression-attribute-values '{ ":g": {"S":"Rock"} }'