DynamoDB 中的表达式属性名称
表达式属性名称是您在 Amazon DynamoDB 表达式中使用的占位符,用作实际属性名称的替换项。表达式属性名称必须以井号 (#
) 开头,后跟一个或多个字母数字字符。
本节介绍您必须使用表达式属性名称的几种情况。
本节中的示例使用 Amazon Command Line Interface (Amazon CLI)。有关编程语言特定的代码示例,请参阅 DynamoDB 和 Amazon SDK 入门。
保留字
有时,您可能需要写入的表达式包含与 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
属性(请参阅 使用表达式时指定项目属性)。
假设您希望使用投影表达式访问 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
。
aws dynamodb get-item \ --table-name ProductCatalog \ --key '{"Id":{"N":"123"}}' \ --projection-expression "ProductReviews.OneStar"
结果将包含所有一星产品评价,这是预期结果。
但是,如果您决定改为使用表达式属性名称呢? 例如,如果您定义 #pr1star
作为 ProductReviews.OneStar
的替代,将发生什么情况?
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.#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"}'
如果您定义表达式属性名称,则该名称在整个表达式中的使用方式必须一致。另外,您不能忽略 #
符号。