

本文為英文版的機器翻譯版本，如內容有任何歧義或不一致之處，概以英文版為準。

# 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 允許您使用點字元和其他特殊字元，例如連字號 (「-」) 作為屬性名稱的一部分。這在某些情況下可能會模棱兩可。為了示範，假設您想要從 `ProductCatalog` 項目擷取 `Safety.Warning` 屬性 (請參閱[在 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"}'
```

如果您定義表達式屬性名稱，則必須在整個表達式中一致地使用它。您也無法省略 `#` 符號。