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(); }