

# DynamoDB 中的表达式属性名称（别名）
<a name="Expressions.ExpressionAttributeNames"></a>

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

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

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

**Topics**
+ [保留字](#Expressions.ExpressionAttributeNames.ReservedWords)
+ [包含特殊字符的属性名称](#Expressions.ExpressionAttributeNames.AttributeNamesContainingSpecialCharacters)
+ [嵌套属性](#Expressions.ExpressionAttributeNames.NestedAttributes)
+ [重复引用属性名称](#Expressions.ExpressionAttributeNames.RepeatingAttributeNames)

## 保留字
<a name="Expressions.ExpressionAttributeNames.ReservedWords"></a>

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

例如，以下 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"}'
```

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

## 包含特殊字符的属性名称
<a name="Expressions.ExpressionAttributeNames.AttributeNamesContainingSpecialCharacters"></a>

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

假设您希望使用投影表达式访问 `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 将返回正确结果。

**注意**  
如果属性名称包含圆点（“.”）或连字符（“-”），则*必须* 使用表达式属性名称替换表达式中该属性的名称。

## 嵌套属性
<a name="Expressions.ExpressionAttributeNames.NestedAttributes"></a>

假设您想访问嵌套属性 `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 将返回正确结果。

## 重复引用属性名称
<a name="Expressions.ExpressionAttributeNames.RepeatingAttributeNames"></a>

表达式属性名称在需要重复引用相同属性名称时很有帮助。例如，请考虑以下用于从 `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"}'
```

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