メニュー
Amazon DynamoDB
開発者ガイド (API Version 2012-08-10)

グローバルセカンダリインデックスes: .NET の使用

AWS SDK for .NET 低レベル API を使用して、1 つ以上の グローバルセカンダリインデックス を持つテーブルを作成し、テーブルのインデックスについて説明し、インデックスを使用してクエリを実行することができます。これらのオペレーションは、対応する DynamoDB オペレーションにマッピングされます。詳細については、『Amazon DynamoDB API Reference』を参照してください。

次に、.NET 低レベル API を使用したテーブルオペレーションの一般的なステップを示します。

  1. AmazonDynamoDBClient クラスのインスタンスを作成します。

  2. 対応するリクエストオブジェクトを作成して、オペレーションについて必要なパラメータとオプションパラメータを入力します。

    たとえば、CreateTableRequest オブジェクトを作成してテーブルと QueryRequest オブジェクトを作成し、テーブルまたはインデックスのクエリを行います。

  3. 前述のステップで作成したクライアントから提供された適切なメソッドを実行します。

グローバルセカンダリインデックス を使用したテーブルの作成

グローバルセカンダリインデックス は、テーブルの作成と同時に作成できます。そのためには、CreateTable を使用して、1 つ以上の グローバルセカンダリインデックス の仕様を指定します。次の 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(); }