使用全域次要索引:.NET - Amazon DynamoDB

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

使用全域次要索引:.NET

您可以使用 AWS SDK for .NET 低階 API 建立含有一或多個全域次要索引的 Amazon DynamoDB 資料表、描述資料表上的索引,以及使用索引執行查詢。這些操作會映射至對應的 DynamoDB 操作。如需詳細資訊,請參閱《Amazon DynamoDB API 參考》。

下列是使用 .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 不是資料表的索引鍵屬性,所以其並非必要項目。不過,沒有 PrecipitationWeatherData 項目不會在 PrecipIndex 中顯示。

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. 以參數形式提供請求物件,以便執行 describeTable 方法。

    建立 DescribeTableRequest 類別的執行個體,以提供請求資訊。您必須提供資料表名稱。

下列 C# 程式碼範例示範前述步驟。

範例
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# 程式碼範例示範前述步驟。

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