Amazon DynamoDB
开发人员指南 (API Version 2012-08-10)
AWS 服务或AWS文档中描述的功能,可能因地区/位置而异。点 击 Getting Started with Amazon AWS to see specific differences applicable to the China (Beijing) Region.

条件表达式

要操作 DynamoDB 表中的数据,请使用 PutItemUpdateItemDeleteItem 操作。(您还可使用 BatchWriteItem 在单个调用中执行多个 PutItemDeleteItem 操作。)

对于这些数据处理操作,您可指定条件表达式 来确定应修改的项目。如果条件表达式的计算结果为 true,则操作成功;否则操作失败。

下面是使用条件表达式的部分 AWS CLI 示例。这些示例基于指定项目属性中介绍的 ProductCatalog 表。此表的分区键是 Id;没有排序键。以下 PutItem 操作将创建一个我们将在示例中引用的示例 ProductCatalog 项目:

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

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

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

防止覆盖现有项目

PutItem 操作将覆盖具有相同键的项目 (如果存在)。如果要避免这种情况,请使用条件表达式。这仅允许写入在有问题的项目没有相同的键时继续进行:

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

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

注意

有关 attribute_not_exists 和其他函数的更多信息,请参阅比较运算符和函数引用

检查项目中的属性

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

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

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

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

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

注意

有关 attribute_not_existsattribute_exists 和其他函数的更多信息,请参阅比较运算符和函数引用

有条件删除

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

让我们通过条件表达式重新访问项目:

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

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

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

  • Price 介于 500 和 600 之间。

以下示例将尝试删除该项目:

Copy
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 中:

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

注意

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

有关 INAND 和其他关键字的更多信息,请参阅比较运算符和函数引用

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

有条件更新

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

注意

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

假定您从条件表达式中所示的项目开始:

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

以下示例执行 UpdateItem 操作。它尝试将产品的 Price 降低 75 - 但条件表达式会在当前 Price 高于 500 时阻止更新:

Copy
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

--item 的参数存储在文件 values.json 中:

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

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

注意

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

有关“>”和其他运算符的更多信息,请参阅比较运算符和函数引用