

# Nomes (aliases) de atributo de expressão no DynamoDB
<a name="Expressions.ExpressionAttributeNames"></a>

Um *nome de atributo de expressão* é um alias (ou espaço reservado) usado em uma expressão do Amazon DynamoDB como alternativa ao nome de atributo real. Um nome de atributo de expressão deve começar com um sinal de cerquilha (`#`) seguido de um ou mais caracteres alfanuméricos. O sublinhado (`_`) também é permitido.

Esta seção descreve várias situações em que você precisa usar nomes de atributos de expressão.

**nota**  
Os exemplos desta seção usam a AWS Command Line Interface (AWS CLI). 

**Topics**
+ [Palavras reservadas](#Expressions.ExpressionAttributeNames.ReservedWords)
+ [Nomes de atributos com caracteres especiais](#Expressions.ExpressionAttributeNames.AttributeNamesContainingSpecialCharacters)
+ [Atributos aninhados](#Expressions.ExpressionAttributeNames.NestedAttributes)
+ [Consultar nomes de atributo de forma repetida](#Expressions.ExpressionAttributeNames.RepeatingAttributeNames)

## Palavras reservadas
<a name="Expressions.ExpressionAttributeNames.ReservedWords"></a>

Algumas vezes, pode ser necessário escrever uma expressão que contém um nome de atributo que está em conflito com uma palavra reservada do DynamoDB. (Para obter uma lista completa de palavras reservadas, consulte [Palavras reservadas no DynamoDB](ReservedWords.md).)

Por exemplo, haveria falha no seguinte exemplo da AWS CLI porque `COMMENT` é uma palavra reservada.

```
aws dynamodb get-item \
    --table-name ProductCatalog \
    --key '{"Id":{"N":"123"}}' \
    --projection-expression "Comment"
```

Para resolver esse problema, substitua `Comment` por um nome de atributo de expressão, como `#c`. A `#` (cerquilha) é obrigatória e indica que esse é um espaço reservado para um nome de atributo. O exemplo da AWS CLI agora deve ter a seguinte aparência.

```
aws dynamodb get-item \
     --table-name ProductCatalog \
     --key '{"Id":{"N":"123"}}' \
     --projection-expression "#c" \
     --expression-attribute-names '{"#c":"Comment"}'
```

**nota**  
Se o nome de um atributo começar com um número, contiver um espaço ou incluir uma palavra reservada, você *deverá* usar um nome de atributo de expressão para substituir esse nome de atributo na expressão.

## Nomes de atributos com caracteres especiais
<a name="Expressions.ExpressionAttributeNames.AttributeNamesContainingSpecialCharacters"></a>

Em uma expressão, um ponto (“.”) é interpretado como um caractere de separação em um caminho de documento. No entanto, o DynamoDB também permite que você use um ponto e outros caracteres especiais, como um hífen (“-”) como parte do nome de um atributo. Isso pode ser ambíguo em alguns casos. Para ilustrar, vamos supor que você queira recuperar o atributo `Safety.Warning` de um item do `ProductCatalog` (consulte [Referir-se a atributos de item ao usar expressões no DynamoDB](Expressions.Attributes.md)).

Suponha que você queira acessar `Safety.Warning` usando uma expressão de projeção.

```
aws dynamodb get-item \
    --table-name ProductCatalog \
    --key '{"Id":{"N":"123"}}' \
    --projection-expression "Safety.Warning"
```

O DynamoDB retorna um resultado vazio, em vez da string esperada (“”). ("`Always wear a helmet`"). Isso ocorre porque o DynamoDB interpreta um ponto em uma expressão como um separador de caminho de documento. Neste caso, defina um nome de atributo de expressão (por exemplo, `#sw`) como um substituto para `Safety.Warning`. Você poderia usar a seguinte expressão de projeção.

```
aws dynamodb get-item \
    --table-name ProductCatalog \
    --key '{"Id":{"N":"123"}}' \
    --projection-expression "#sw" \
    --expression-attribute-names '{"#sw":"Safety.Warning"}'
```

Em seguida, o DynamoDB deverá retornar o resultado correto.

**nota**  
Se o nome de um atributo contiver um ponto (“.”) ou um hífen (“-”), você *deverá* usar um nome de atributo de expressão para substituir o nome desse atributo na expressão.

## Atributos aninhados
<a name="Expressions.ExpressionAttributeNames.NestedAttributes"></a>

Suponha que você queira acessar o atributo `ProductReviews.OneStar` aninhado. No nome de atributo de expressão, o DynamoDB trata o ponto (“.”) como um caractere no nome de um atributo. Para consultar o atributo aninhado, defina um nome de atributo de expressão para cada elemento no caminho do documento:
+ `#pr — ProductReviews`
+ `#1star — OneStar`

Você poderia usar `#pr.#1star` para a expressão de projeção.

```
aws dynamodb get-item \
    --table-name ProductCatalog \
    --key '{"Id":{"N":"123"}}' \
    --projection-expression "#pr.#1star"  \
    --expression-attribute-names '{"#pr":"ProductReviews", "#1star":"OneStar"}'
```

Em seguida, o DynamoDB deverá retornar o resultado correto.

## Consultar nomes de atributo de forma repetida
<a name="Expressions.ExpressionAttributeNames.RepeatingAttributeNames"></a>

Os nomes de atributo de expressão são úteis quando você precisa consultar o mesmo nome de atributo repetidamente. Por exemplo, considere a seguinte expressão para recuperar algumas das revisões de um item do `ProductCatalog`.

```
aws dynamodb get-item \
    --table-name ProductCatalog \
    --key '{"Id":{"N":"123"}}' \
    --projection-expression "ProductReviews.FiveStar, ProductReviews.ThreeStar, ProductReviews.OneStar"
```

Para tornar isso mais conciso, você pode substituir `ProductReviews` por um nome de atributo de expressão, como `#pr`. A expressão revisada agora teria a seguinte aparência.
+  `#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"}'
```

Caso defina um nome de atributo de expressão, você deverá usá-lo de forma consistente na expressão inteira. Além disso, não é possível omitir o símbolo `#`. 