Amazon DynamoDB
开发人员指南 (API Version 2012-08-10)
AWS 服务或AWS文档中描述的功能,可能因地区/位置而异。点 击 Getting Started with Amazon AWS to see specific differences applicable to the China (Beijing) Region.

使用全局二级索引:.NET

您可以使用适用于 .NET 的 AWS 开发工具包中的低级 API 创建带一个或多个全局二级索引的表、描述表中的索引,以及使用索引执行查询。这些操作会映射到相应的 DynamoDB 操作。有关更多信息,请参阅 Amazon DynamoDB API Reference

以下是使用 .NET 低级 API 执行表操作的常见步骤。

  1. 创建 AmazonDynamoDBClient 类的实例。

  2. 通过创建对应的请求数据元,为操作提供必需参数和可选参数。

    例如,创建一个 CreateTableRequest 对象以创建表;创建一个 QueryRequest 对象以查询表或索引。

  3. 执行您在前面步骤中创建的客户端提供的适当方法。

创建含有全局二级索引的表

您可在创建表的同时创建全局二级索引。为此,请使用 CreateTable 并提供一个或多个全局二级索引的规格。以下 C# 代码段用于创建一个容纳有关天气数据信息的表。分区键为 Location,排序键为 Date。通过一个名为 PrecipIndex 的 全局二级索引,可以快速访问各个位置的降水数据。

以下是使用 .NET 低级别 API 创建具有全局二级索引的表的步骤。

  1. 创建 AmazonDynamoDBClient 类的实例。

  2. 创建 CreateTableRequest 类实例,以提供请求信息。

    您必须提供表名称、主键以及预置吞吐量值。对于全局二级索引,您必须提供索引名称、其预置的吞吐量设置、索引排序键的属性定义、索引的键架构以及属性投影。

  3. 以参数形式提供请求数据元,以执行 CreateTable 方法。

以下 C# 代码段执行的就是上述步骤。该代码段创建含有 全局二级索引 (PrecipIndex) 的表 (WeatherData)。索引分区键为 Date,其排序键为 Precipitation。所有表属性都投影到索引中。用户可以查询此索引以获得特定日期的天气数据,也可按降水量对数据进行排序。

请注意,由于 Precipitation 不是该表的键属性,因此它不是必需的;然而,不含 Precipitation 的 WeatherData 项目不会出现在 PrecipIndex 中。

Copy
client = new AmazonDynamoDBClient(); string tableName = "WeatherData"; // Attribute definitions var attributeDefinitions = new List<AttributeDefinition>() { {new AttributeDefinition{ AttributeName = "Location", AttributeType = "S"}}, {new AttributeDefinition{ AttributeName = "Date", AttributeType = "S"}}, {new AttributeDefinition(){ AttributeName = "Precipitation", AttributeType = "N"} } }; // Table key schema var tableKeySchema = new List<KeySchemaElement>() { {new KeySchemaElement { AttributeName = "Location", KeyType = "HASH"}}, //Partition key {new KeySchemaElement { AttributeName = "Date", KeyType = "RANGE"} //Sort key } }; // PrecipIndex var precipIndex = new GlobalSecondaryIndex { IndexName = "PrecipIndex", ProvisionedThroughput = new ProvisionedThroughput { ReadCapacityUnits = (long)10, WriteCapacityUnits = (long)1 }, Projection = new Projection { ProjectionType = "ALL" } }; var indexKeySchema = new List<KeySchemaElement> { {new KeySchemaElement { AttributeName = "Date", KeyType = "HASH"}}, //Partition key {new KeySchemaElement{AttributeName = "Precipitation",KeyType = "RANGE"}} //Sort key }; precipIndex.KeySchema = indexKeySchema; CreateTableRequest createTableRequest = new CreateTableRequest { TableName = tableName, ProvisionedThroughput = new ProvisionedThroughput { ReadCapacityUnits = (long)5, WriteCapacityUnits = (long)1 }, AttributeDefinitions = attributeDefinitions, KeySchema = tableKeySchema, GlobalSecondaryIndexes = { precipIndex } }; CreateTableResponse response = client.CreateTable(createTableRequest); Console.WriteLine(response.CreateTableResult.TableDescription.TableName); Console.WriteLine(response.CreateTableResult.TableDescription.TableStatus);

您必须等待 DynamoDB 创建该表并将表的状态设置为 ACTIVE。然后,您就可以开始在表中添加数据元项目。

描述含有 全局二级索引 的表

要获取有关表中的全局二级索引的信息,请使用 DescribeTable。对于每个索引,您都可以查看其名称、键架构和投影的属性。

以下介绍使用 .NET 低级别 API 访问表的全局二级索引信息的步骤。

  1. 创建 AmazonDynamoDBClient 类的实例。

  2. 创建 DescribeTableRequest 类实例,以提供请求信息。您必须提供表名称。

  3. 以参数形式提供请求数据元,以执行 describeTable 方法。

以下 C# 代码段执行的就是上述步骤。

Copy
client = new AmazonDynamoDBClient(); string tableName = "WeatherData"; DescribeTableResponse response = client.DescribeTable(new DescribeTableRequest { TableName = tableName}); List<GlobalSecondaryIndexDescription> globalSecondaryIndexes = response.DescribeTableResult.Table.GlobalSecondaryIndexes; // This code snippet will work for multiple indexes, even though // there is only one index in this example. foreach (GlobalSecondaryIndexDescription gsiDescription in globalSecondaryIndexes) { Console.WriteLine("Info for index " + gsiDescription.IndexName + ":"); foreach (KeySchemaElement kse in gsiDescription.KeySchema) { Console.WriteLine("\t" + kse.AttributeName + ": key type is " + kse.KeyType); } Projection projection = gsiDescription.Projection; Console.WriteLine("\tThe projection type is: " + projection.ProjectionType); if (projection.ProjectionType.ToString().Equals("INCLUDE")) { Console.WriteLine("\t\tThe non-key projected attributes are: " + projection.NonKeyAttributes); } }

查询 全局二级索引

您可以对全局二级索引使用 Query (基本上与对表执行 Query 操作相同)。您需要指定索引名称、索引分区键和排序键 (如果有) 的查询条件以及要返回的属性。在此示例中,索引为 PrecipIndex,它具有分区键 Date 和排序键 Precipitation。该索引查询返回降水量大于零的特定日期的所有天气数据。

以下是使用 .NET 低级别 API 查询全局二级索引的步骤。

  1. 创建 AmazonDynamoDBClient 类的实例。

  2. 创建 QueryRequest 类实例,以提供请求信息。

  3. 以参数形式提供请求数据元,以执行 query 方法。

属性名称 Date 是一个 DynamoDB 保留关键字。因此,我们必须使用表达式属性名称作为 KeyConditionExpression 中的占位符。

以下 C# 代码段执行的就是上述步骤。

Copy
client = new AmazonDynamoDBClient(); QueryRequest queryRequest = new QueryRequest { TableName = "WeatherData", IndexName = "PrecipIndex", KeyConditionExpression = "#dt = :v_date and Precipitation > :v_precip", ExpressionAttributeNames = new Dictionary<String, String> { {"#dt", "Date"} }, ExpressionAttributeValues = new Dictionary<string, AttributeValue> { {":v_date", new AttributeValue { S = "2013-08-01" }}, {":v_precip", new AttributeValue { N = "0" }} }, ScanIndexForward = true }; var result = client.Query(queryRequest); var items = result.Items; foreach (var currentItem in items) { foreach (string attr in currentItem.Keys) { Console.Write(attr + "---> "); if (attr == "Precipitation") { Console.WriteLine(currentItem[attr].N); } else { Console.WriteLine(currentItem[attr].S); } } Console.WriteLine(); }