AttributeUpdates - Amazon DynamoDB
AWS 文档中描述的 AWS 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅中国的 AWS 服务入门

本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。

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"} }'