DynamoDB 中的表达式属性名称(别名)
表达式属性名称是您在 Amazon DynamoDB 表达式中使用的别名(或占位符),用作实际属性名称的替换项。表达式属性名称必须以井号(#
)开头,后跟一个或多个字母数字字符。还允许使用下划线(_
)字符。
本节介绍您必须使用表达式属性名称的几种情况。
注意
本节中的示例使用 Amazon Command Line Interface (Amazon CLI)。
保留字
有时,您可能需要写入的表达式包含与 DynamoDB 保留字冲突的属性名。(有关保留关键字的完整列表,请参阅 DynamoDB 中的保留字。)
例如,以下 Amazon CLI 示例将由于 COMMENT
是保留字而失败。
aws dynamodb get-item \ --table-name ProductCatalog \ --key '{"Id":{"N":"123"}}' \ --projection-expression "Comment"
要解决此问题,您可使用诸如 Comment
的表达式属性名称来替换 #c
。#
(井号)是必需的,指示这是属性名称的占位符。Amazon 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"}'
如果您定义表达式属性名称,则该名称在整个表达式中的使用方式必须一致。另外,您不能忽略 #
符号。