

# 在 DynamoDB 中使用表达式时引用项目属性
<a name="Expressions.Attributes"></a>

本节介绍如何在 Amazon DynamoDB 中的表达式中引用项目属性。您可以使用任何属性，即使它深层嵌套在多个列表和映射中。

**Topics**
+ [顶级属性](#Expressions.Attributes.TopLevelAttributes)
+ [嵌套属性](#Expressions.Attributes.NestedAttributes)
+ [文档路径](#Expressions.Attributes.NestedElements.DocumentPathExamples)

**项目示例：ProductCatalog**  
本页上的示例使用 `ProductCatalog` 表中的以下项目示例。（此表在 [在 DynamoDB 中使用的示例表和数据](AppendixSampleTables.md) 中说明。）

```
{
    "Id": 123,
    "Title": "Bicycle 123",
    "Description": "123 description",
    "BicycleType": "Hybrid",
    "Brand": "Brand-Company C",
    "Price": 500,
    "Color": ["Red", "Black"],
    "ProductCategory": "Bicycle",
    "InStock": true,
    "QuantityOnHand": null,
    "RelatedItems": [
        341,
        472,
        649
    ],
    "Pictures": {
        "FrontView": "http://example.com/products/123_front.jpg",
        "RearView": "http://example.com/products/123_rear.jpg",
        "SideView": "http://example.com/products/123_left_side.jpg"
    },
    "ProductReviews": {
	    "FiveStar": [
	    		"Excellent! Can't recommend it highly enough! Buy it!",
	    		"Do yourself a favor and buy this."
	    ],
	    "OneStar": [
	    		"Terrible product! Do not buy this."
	    ]
    },
    "Comment": "This product sells out quickly during the summer",
    "Safety.Warning": "Always wear a helmet"
 }
```

请注意以下几点：
+ 分区键值 (`Id`) 是 `123`。没有排序键。
+ 大多数属性都具有标量数据类型，例如 `String`、`Number`、`Boolean` 和 `Null`。
+ 一个属性 (`Color`）是一个 `String Set`。
+ 以下属性是文档数据类型：
  + `RelatedItems` 列表。每个元素都是相关产品的 `Id`。
  + `Pictures` 的映射。每个元素都是图片的简短描述，以及相应图片文件的 URL。
  + `ProductReviews` 的映射。每个元素代表一个评级和一个与该评级相对应的评论列表。最初，此映射填充五星级和一星级评论。

## 顶级属性
<a name="Expressions.Attributes.TopLevelAttributes"></a>

如果属性没有嵌入其他属性，则视为*顶级*。对于 `ProductCatalog` 项目，顶级属性如下所示：
+ `Id`
+ `Title`
+ `Description`
+ `BicycleType`
+ `Brand`
+ `Price`
+ `Color`
+ `ProductCategory`
+ `InStock`
+ `QuantityOnHand`
+ `RelatedItems`
+ `Pictures`
+ `ProductReviews`
+ `Comment`
+ `Safety.Warning`

所有这些顶级属性都是标量，除了 `Color`（列表）、`RelatedItems`（列表）、`Pictures`（映射）和 `ProductReviews`（映射）。

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

如果属性嵌入其他属性，则视为*嵌套*。要访问嵌套属性，请使用*取消引用运算符*：
+ `[n]`— 用于列表元素
+ `.`（点）-用于映射元素

### 访问列表元素
<a name="Expressions.Attributes.NestedElements.AccessingListElements"></a>

列表元素的取消引用运算符是 **[*n*]**，其中，*n* 是元素编号。列表元素从 0 开始，因此 [0] 表示列表中的第一个元素，[1] 表示第二个元素，依此类推。下面是一些示例：
+ `MyList[0]`
+ `AnotherList[12]`
+ `ThisList[5][11]`

元素 `ThisList[5]` 本身就是一个嵌套列表。因此，`ThisList[5][11]` 指的是该列表中的第 12 个元素。

方括号内的数字必须为非负整数。因此，以下表达式是无效的：
+ `MyList[-1]`
+ `MyList[0.4]`

### 访问映射元素
<a name="Expressions.Attributes.NestedElements.AccessingMapElements"></a>

地图元素的取消引用运算符为 **.**（一个点）。使用点作为映射中元素之间的分隔符：
+ `MyMap.nestedField`
+ `MyMap.nestedField.deeplyNestedField`

## 文档路径
<a name="Expressions.Attributes.NestedElements.DocumentPathExamples"></a>

在表达式中，您可以使用*文档路径*来告诉 DynamoDB 在哪里可以找到属性。对于顶级属性，文档路径只是属性名称。对于嵌套属性，您可以使用取消引用运算符构建文档路径。

下面是文档路径的一些示例。（请参阅 [在 DynamoDB 中使用表达式时引用项目属性](#Expressions.Attributes)。）
+ 顶级标量属性。

   `Description`
+ 顶级列表属性。（这将返回整个列表，而不仅仅是一些元素。）

  `RelatedItems`
+ 第三个元素来自 `RelatedItems` 列表。（请记住，列表元素是从零开始的。）

  `RelatedItems[2]`
+ 产品的正视图。

  `Pictures.FrontView`
+ 所有五星评论。

  `ProductReviews.FiveStar`
+ 第一个五星级评论。

  `ProductReviews.FiveStar[0]`

**注意**  
文档路径的最大深度为 32。因此，路径中取消引用运算符的数量不能超过此限制。

您可以在文档路径中使用任何属性名称，只要它们符合以下要求：
+ 第一个字符是 `a-z`、`A-Z` 或 `0-9`
+ 第二个字符（如果存在）是 `a-z` 或 `A-Z`

**注意**  
如果属性名称不满足此要求，则您必须将表达式属性名称定义为占位符。

有关更多信息，请参阅 [DynamoDB 中的表达式属性名称（别名）](Expressions.ExpressionAttributeNames.md)。