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

表达式属性名称

表达式属性名称 是您在表达式中使用的占位符,用作实际属性名称的替换项。表达式属性名称必须以 # 开头,后跟一个或多个字母数字字符。

本节介绍您需要使用表达式属性名称的几种情况。

注意

本节中的示例使用了 AWS CLI。有关编程语言特定代码示例,请参阅 Amazon DynamoDB 入门指南

保留关键字

有时,您需要写入的表达式包含与 DynamoDB 保留关键字冲突的属性名。(有关保留关键字的完整列表,请参阅DynamoDB 中的保留关键字。)

例如,以下 AWS CLI 示例将由于 COMMENT 是保留字而失败:

Copy
aws dynamodb get-item \ --table-name ProductCatalog \ --key '{"Id":{"N":"123"}}' \ --projection-expression "Comment"

要解决此问题,您可使用诸如 #c 的表达式属性名称来替换 Comment#(井号)是必需的,指示这是属性名称的占位符。AWS CLI 示例现在如下所示:

Copy
aws dynamodb get-item \ --table-name ProductCatalog \ --key '{"Id":{"N":"123"}}' \ --projection-expression "#c" \ --expression-attribute-names '{"#c":"Comment"}'

注意

如果属性名称以数字开头或者包含空格、特殊字符或保留关键字,则您必须在表达式中使用表达式属性名称替换该属性名称。

包含点的属性名称

在表达式中,点 (".") 解释为文档路径中的分隔符字符。但是,DynamoDB 也允许您在属性名称中使用点字符。在一些情况下这会造成混淆。为了说明这种情况,假设您要从 ProductCatalog 项目中检索 Safety.Warning 属性 (请参阅指定项目属性):

假设您希望使用投影表达式访问 Safety.Warning

Copy
aws dynamodb get-item \ --table-name ProductCatalog \ --key '{"Id":{"N":"123"}}' \ --projection-expression "Safety.Warning"

DynamoDB 将返回空结果,而不是预期的字符串 (“Always wear a helmet ”)。这是因为,DynamoDB 将表达式中的一个点解释为文档路径分隔符。在这种情况下,您需要定义表达式属性名称(例如 #sw)来替换 Safety.Warning。然后,您可以使用以下投影表达式:

Copy
aws dynamodb get-item \ --table-name ProductCatalog \ --key '{"Id":{"N":"123"}}' \ --projection-expression "#sw" \ --expression-attribute-names '{"#sw":"Safety.Warning"}'

接下来 DynamoDB 将返回正确结果。

嵌套属性

假设您要使用以下投影表达式访问嵌套属性 ProductReviews.OneStar

Copy
aws dynamodb get-item \ --table-name ProductCatalog \ --key '{"Id":{"N":"123"}}' \ --projection-expression "ProductReviews.OneStar"

结果将包含所有一星产品评价,这是预期结果。

但是,如果您决定改为使用表达式属性名称呢?例如,如果您定义 #pr1star 作为 ProductReviews.OneStar 的替代,将发生什么情况?

Copy
aws dynamodb get-item \ --table-name ProductCatalog \ --key '{"Id":{"N":"123"}}' \ --projection-expression "#pr1star" \ --expression-attribute-names '{"#pr1star":"ProductReviews.OneStar"}'

DynamoDB 将返回一个空结果,而不是预期的一星评价映射。这是因为 DynamoDB 将表达式属性值中的点字符解释为属性名称中的字符。在 DynamoDB 评估表达式属性名称 #pr1star 时,它确定 ProductReviews.OneStar 引用了标量属性,而这并非本意。

正确方法是为文档路径中的每个元素定义一个表达式属性名称:

  • #pr — ProductReviews

  • #1star — OneStar

然后,您可以对投影表达式使用 #pr.#1s

Copy
aws dynamodb get-item \ --table-name ProductCatalog \ --key '{"Id":{"N":"123"}}' \ --projection-expression "#pr.#1star" \ --expression-attribute-names '{"#pr":"ProductReviews", "#1star":"OneStar"}'

接下来 DynamoDB 将返回正确结果。

重复属性名称

表达式属性名称在需要重复引用相同属性名称时很有帮助。例如,请考虑以下用于从 ProductCatalog 项目中检索一些评论的表达式:

Copy
aws dynamodb get-item \ --table-name ProductCatalog \ --key '{"Id":{"N":"123"}}' \ --projection-expression "ProductReviews.FiveStar, ProductReviews.ThreeStar, ProductReviews.OneStar"

要使表达式更加简洁,您可以使用诸如 #pr 的表达式属性名称来替换 ProductReviews。现在,修订的表达式如下所示:

  • #pr.FiveStar, #pr.ThreeStar, #pr.OneStar

Copy
aws dynamodb get-item \ --table-name ProductCatalog \ --key '{"Id":{"N":"123"}}' \ --projection-expression "#pr.FiveStar, #pr.ThreeStar, #pr.OneStar" \ --expression-attribute-names '{"#pr":"ProductReviews"}'

如果您定义表达式属性名称,则该名称在整个表达式中的使用方式必须一致。另外,您不能忽略 # 符号。