DynamoDB 条件表达式 CLI 示例 - Amazon DynamoDB
Amazon Web Services 文档中描述的 Amazon Web Services 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅 中国的 Amazon Web Services 服务入门 (PDF)

DynamoDB 条件表达式 CLI 示例

下面是使用条件表达式的一些 Amazon Command Line Interface (Amazon CLI) 示例。这些示例基于在 DynamoDB 中使用表达式时引用项目属性中介绍的 ProductCatalog 表。此表的分区键是 Id;没有排序键。以下 PutItem 操作创建示例所引用的 ProductCatalog 项目例子。

aws dynamodb put-item \ --table-name ProductCatalog \ --item file://item.json

--item 的参数存储在 item.json 文件中。(为简单起见,仅使用了几个项目属性。)

{ "Id": {"N": "456" }, "ProductCategory": {"S": "Sporting Goods" }, "Price": {"N": "650" } }

带条件放置

PutItem 操作覆盖具有相同主键的项目(如果存在)。如果要避免这种情况,请使用条件表达式。这样,只有当相关的项目还没有相同的主键时,才能继续写入。

以下示例使用 attribute_not_exists() 在尝试写入操作之前检查表中是否存在主键。

注意

如果主键同时包含分区键(pk)和排序键(sk),该参数将在尝试写入操作之前检查 attribute_not_exists(pk)attribute_not_exists(sk) 作为整个语句的计算结果是 true 还是 false。

aws dynamodb put-item \ --table-name ProductCatalog \ --item file://item.json \ --condition-expression "attribute_not_exists(Id)"

如果条件表达式的计算结果为 false,DynamoDB 将返回以下错误消息:有条件请求失败

注意

有关 attribute_not_exists 和其他函数的更多信息,请参阅 DynamoDB 中的条件表达式和筛选表达式、运算符及函数

带条件删除

要执行有条件删除,请将 DeleteItem 操作与条件表达式一起使用。要继续执行操作,条件表达式的求值结果必须为 true;否则操作将失败。

考虑上面定义的项目。

假设您要删除该项目,但只能在以下条件下删除:

  • ProductCategory 为“Sporting Goods”或“Gardening Supplies”。

  • Price 介于 500 和 600 之间。

以下示例尝试删除该项目。

aws dynamodb delete-item \ --table-name ProductCatalog \ --key '{"Id":{"N":"456"}}' \ --condition-expression "(ProductCategory IN (:cat1, :cat2)) and (Price between :lo and :hi)" \ --expression-attribute-values file://values.json

--expression-attribute-values 的参数存储在 values.json 文件中。

{ ":cat1": {"S": "Sporting Goods"}, ":cat2": {"S": "Gardening Supplies"}, ":lo": {"N": "500"}, ":hi": {"N": "600"} }
注意

在条件表达式中,:(冒号字符)表示表达式属性值-实际值的占位符。有关更多信息,请参阅 在 DynamoDB 中使用表达式属性值

有关 INAND 和其他关键字的更多信息,请参阅DynamoDB 中的条件表达式和筛选表达式、运算符及函数

在本示例中,ProductCategory 比较的计算结果为 true,但 Price 比较的计算结果为 false。这导致条件表达式的计算结果为 false,并且 DeleteItem 操作失败。

带条件更新

要执行有条件更新,请将 UpdateItem 操作与条件表达式一起使用。要继续执行操作,条件表达式的求值结果必须为 true;否则操作将失败。

注意

UpdateItem 还支持更新表达式,您在其中指定要对项目进行的修改。有关更多信息,请参阅 在 DynamoDB 中使用更新表达式

假定您从上面定义的项目开始。

以下示例执行 UpdateItem 操作。它试图将产品的 Price 减少 75,但是如果当前 Price 小于或等于 500,条件表达式会阻止更新。

aws dynamodb update-item \ --table-name ProductCatalog \ --key '{"Id": {"N": "456"}}' \ --update-expression "SET Price = Price - :discount" \ --condition-expression "Price > :limit" \ --expression-attribute-values file://values.json

--expression-attribute-values 的参数存储在 values.json 文件中。

{ ":discount": { "N": "75"}, ":limit": {"N": "500"} }

如果起始 Price 为 650,则 UpdateItem 操作会将 Price 降至 575。如果您再次运行 UpdateItem 操作,Price 将降至 500。如果您第三次运行该操作,则条件表达式的计算结果为 false,并且更新失败。

注意

在条件表达式中,:(冒号字符)表示表达式属性值-实际值的占位符。有关更多信息,请参阅 在 DynamoDB 中使用表达式属性值

有关“>”和其他运算符的更多信息,请参阅 DynamoDB 中的条件表达式和筛选表达式、运算符及函数

条件表达式示例

有关以下示例中使用的函数的更多信息,请参阅 DynamoDB 中的条件表达式和筛选表达式、运算符及函数。若要详细了解如何在表达式中指定不同的属性类型,请参阅 在 DynamoDB 中使用表达式时引用项目属性

检查项目中的属性

您可以检查任何属性是否存在。如果条件表达式的计算结果为 true,则操作成功;否则操作失败。

以下示例使用了 attribute_not_exists,以便仅当产品没有 Price 属性时才删除产品。

aws dynamodb delete-item \ --table-name ProductCatalog \ --key '{"Id": {"N": "456"}}' \ --condition-expression "attribute_not_exists(Price)"

DynamoDB 还提供了一个 attribute_exists 函数。以下示例仅当收到不好的评价时删除产品。

aws dynamodb delete-item \ --table-name ProductCatalog \ --key '{"Id": {"N": "456"}}' \ --condition-expression "attribute_exists(ProductReviews.OneStar)"

检查属性类型

您可以使用 attribute_type 函数检查属性值的数据类型。如果条件表达式的计算结果为 true,则操作成功;否则操作失败。

以下示例使用 attribute_type 删除具有类型为“字符串集”的 Color 属性的产品。

aws dynamodb delete-item \ --table-name ProductCatalog \ --key '{"Id": {"N": "456"}}' \ --condition-expression "attribute_type(Color, :v_sub)" \ --expression-attribute-values file://expression-attribute-values.json

--expression-attribute-values 的参数存储在 expression-attribute-values.json 文件中。

{ ":v_sub":{"S":"SS"} }

检查字符串的起始值

您可以使用 begins_with 函数检查字符串属性值是否以特定子字符串开头。如果条件表达式的计算结果为 true,则操作成功;否则操作失败。

以下示例使用 begins_with 删除 Pictures 映射的 FrontView 元素以特定值开头的产品。

aws dynamodb delete-item \ --table-name ProductCatalog \ --key '{"Id": {"N": "456"}}' \ --condition-expression "begins_with(Pictures.FrontView, :v_sub)" \ --expression-attribute-values file://expression-attribute-values.json

--expression-attribute-values 的参数存储在 expression-attribute-values.json 文件中。

{ ":v_sub":{"S":"http://"} }

检查集中的元素

您可以使用 contains 函数检查集中的元素或在字符串内查找子字符串。如果条件表达式的计算结果为 true,则操作成功;否则操作失败。

以下示例使用 contains 删除 Color 字符串集中包含具有特定值的元素的产品。

aws dynamodb delete-item \ --table-name ProductCatalog \ --key '{"Id": {"N": "456"}}' \ --condition-expression "contains(Color, :v_sub)" \ --expression-attribute-values file://expression-attribute-values.json

--expression-attribute-values 的参数存储在 expression-attribute-values.json 文件中。

{ ":v_sub":{"S":"Red"} }

检查属性值的大小

您可以使用 size 函数检查属性值的大小。如果条件表达式的计算结果为 true,则操作成功;否则操作失败。

以下示例使用 size 删除 VideoClip 二进制属性的大小超过 64000 字节的产品。

aws dynamodb delete-item \ --table-name ProductCatalog \ --key '{"Id": {"N": "456"}}' \ --condition-expression "size(VideoClip) > :v_sub" \ --expression-attribute-values file://expression-attribute-values.json

--expression-attribute-values 的参数存储在 expression-attribute-values.json 文件中。

{ ":v_sub":{"N":"64000"} }