DynamoDB 中的表达式属性名称(别名) - Amazon DynamoDB

DynamoDB 中的表达式属性名称(别名)

表达式属性名称是您在 Amazon DynamoDB 表达式中使用的别名(或占位符),用作实际属性名称的替换项。表达式属性名称必须以井号(#)开头,后跟一个或多个字母数字字符。还允许使用下划线(_)字符。

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

注意

本节中的示例使用 AWS Command Line Interface (AWS CLI)。

保留字

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

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

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

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

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

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

包含特殊字符的属性名称

在表达式中,点(“.”)将解释为文档路径中的分隔符字符。然而,DynamoDB 还允许您在属性名称中使用点字符和其他特殊字符,例如连字符(“-”)。在一些情况下这会造成混淆。为了说明这种情况,假设您要从 Safety.Warning 项目中检索 ProductCatalog 属性(请参阅 在 DynamoDB 中使用表达式时引用项目属性)。

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

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

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

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

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

注意

如果属性名称包含圆点(“.”)或连字符(“-”),则必须 使用表达式属性名称替换表达式中该属性的名称。

嵌套属性

假设您想访问嵌套属性 ProductReviews.OneStar。在表达式属性名称中,DynamoDB 将点(“.”)视为属性名称中的字符。要引用嵌套属性,请为文档路径中的每个元素定义一个表达式属性名称:

  • #pr — ProductReviews

  • #1star — OneStar

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

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

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

重复引用属性名称

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

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

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

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

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

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