Utilisation d'index secondaires globaux : .NET - Amazon DynamoDB

Utilisation d'index secondaires globaux : .NET

Vous pouvez utiliser l'API de bas niveau d'AWS SDK for .NET pour créer une table Amazon DynamoDB avec un ou plusieurs index secondaires globaux, décrire les index sur la table, et effectuer des requêtes à l'aide des index. Ces opérations mappent aux opérations DynamoDB correspondantes. Pour plus d'informations, consultez la Référence d'API Amazon DynamoDB.

Voici les étapes courantes pour les opérations de table à l'aide de l'API de bas niveau .NET.

  1. Créez une instance de la classe AmazonDynamoDBClient.

  2. Fournissez les paramètres obligatoires et facultatifs pour l'opération en créant les objets de requête correspondants.

    Par exemple, créez un objet CreateTableRequest pour créer une table, et un objet QueryRequest pour interroger une table ou un index.

  3. Exécutez la méthode appropriée fournie par le client, que vous avez créée à l'étape précédente.

Créer une table avec un index secondaire global

Vous pouvez créer des index secondaires globaux au moment où vous créez une table. Pour ce faire, utilisez CreateTable et fournissez vos spécifications pour un ou plusieurs index secondaires globaux. L'exemple de code C# suivant crée une table destinée à accueillir des données météorologiques. La clé de partition est Location, et la clé de tri Date. Un index secondaire global nommé PrecipIndex permet un accès rapide aux données de précipitations pour différents endroits.

Voici les étapes à suivre pour créer une table avec un index secondaire global à l'aide de l'API de bas niveau .NET.

  1. Créez une instance de la classe AmazonDynamoDBClient.

  2. Créez une instance de la classe CreateTableRequest pour fournir l'information de requête.

    Vous devez fournir le nom de la table, sa clé primaire et les valeurs de débit approvisionné. Pour l'index secondaire global, vous devez fournir le nom de l'index, ses paramètres de débit approvisionné, les définitions d'attribut pour la clé de tri d'index, le schéma de clé pour l'index et la projection d'attribut.

  3. Exécutez la méthode CreateTable en fournissant l'objet de demande comme paramètre.

L'exemple de code C# suivant présente les étapes précédentes. Le code crée une table (WeatherData) avec un index secondaire global (PrecipIndex). La clé de partition d'index est Date, et la clé de tri Precipitation. Tous les attributs de table sont projetés sur l'index. Les utilisateurs peuvent interroger cet index afin d'obtenir des données météorologiques pour une date particulière, en triant éventuellement les données par quantité de précipitations.

Precipitation n'étant pas un attribut de clé pour la table, il n'est pas obligatoire. Toutefois, les éléments WeatherData sans Precipitation n'apparaissent pas dans 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);

Vous devez attendre que DynamoDB crée la table et définisse l'état de celle-ci sur ACTIVE. Après cela, vous pouvez commencer à insérer des éléments de données dans la table.

Décrire une table avec un index secondaire global

Pour obtenir des informations concernant les index secondaires globaux sur une table, utilisez l'opération DescribeTable. Pour chaque index, vous pouvez accéder à son nom, à son schéma de clé et aux attributs projetés.

Voici les étapes à suivre pour accéder aux informations d'index secondaire global pour une table à l'aide de l'API de bas niveau .NET.

  1. Créez une instance de la classe AmazonDynamoDBClient.

  2. Exécutez la méthode describeTable en fournissant l'objet de demande comme paramètre.

    Créez une instance de la classe DescribeTableRequest pour fournir l'information de requête. Vous devez fournir le nom de la table.

L'exemple de code C# suivant présente les étapes précédentes.

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

Interroger un index secondaire global

Vous pouvez utiliser l'opération Query sur un index secondaire global de la même manière que vous utilisez l'opération Query sur une table. Vous devez spécifier le nom de l'index, les critères de requête pour la clé de partition d'index et la clé de tri (le cas échéant), ainsi que les attributs que vous souhaitez renvoyer. Dans cet exemple, l'index est PrecipIndex. Il a une clé de partition Date et une clé de tri Precipitation. L'interrogation de l'index renvoie toutes les données météorologiques pour une date particulière, où les précipitations sont supérieures à zéro.

Voici les étapes à suivre pour interroger un index secondaire global à l'aide de l'API de bas niveau .NET.

  1. Créez une instance de la classe AmazonDynamoDBClient.

  2. Créez une instance de la classe QueryRequest pour fournir l'information de requête.

  3. Exécutez la méthode query en fournissant l'objet de demande comme paramètre.

Nom d'attribut Date est un mot réservé DynamoDB. Par conséquent, vous devez utiliser un nom d'attribut d'expression comme espace réservé dans la KeyConditionExpression.

L'exemple de code C# suivant présente les étapes précédentes.

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