DynamoDB 中的表达式属性名称 - Amazon DynamoDB
Amazon Web Services 文档中描述的 Amazon Web Services 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅 中国的 Amazon Web Services 服务入门 (PDF)

本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。

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"}'

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