Interrogation des tables et des index : .NET - Amazon DynamoDB

Les traductions sont fournies par des outils de traduction automatique. En cas de conflit entre le contenu d'une traduction et celui de la version originale en anglais, la version anglaise prévaudra.

Interrogation des tables et des index : .NET

L'opération Query vous permet d'interroger une table ou un index secondaire dans Amazon DynamoDB. Vous devez fournir une valeur de clé de partition et une condition d'égalité. Si la table ou l'index dispose d'une clé de tri, vous pouvez affiner les résultats en fournissant une valeur de clé de tri et une condition.

Voici les étapes à suivre pour interroger une table à l'aide de l' AWS SDK for .NET API de bas niveau.

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

  2. Créez une instance de la classe QueryRequest et fournissez les paramètres d'opération de la requête.

  3. Exécutez la méthode Query et fournissez l'objet QueryRequest que vous avez créé à l'étape précédente.

    La réponse inclut l'objet QueryResult qui fournit tous les éléments renvoyés par la requête.

L'exemple de code C# suivant présente les tâches précédentes. Par exemple, supposons que vous ayez une table Reply qui stocke les réponses pour les threads de forum. Pour de plus amples informations, veuillez consulter Création de tables et chargement de données pour des exemples de code dans DynamoDB.

Exemple
Reply Id, ReplyDateTime, ... )

Chaque thread de forum a un ID unique et peut avoir zéro ou plusieurs réponses. Par conséquent, la clé primaire est composée de Id (clé de partition) et de ReplyDateTime (clé de tri).

La requête suivante récupère toutes les réponses pour un objet thread spécifique. La requête requiert à la fois le nom de la table et la valeur Subject.

Exemple
AmazonDynamoDBClient client = new AmazonDynamoDBClient(); var request = new QueryRequest { TableName = "Reply", KeyConditionExpression = "Id = :v_Id", ExpressionAttributeValues = new Dictionary<string, AttributeValue> { {":v_Id", new AttributeValue { S = "Amazon DynamoDB#DynamoDB Thread 1" }}} }; var response = client.Query(request); foreach (Dictionary<string, AttributeValue> item in response.Items) { // Process the result. PrintItem(item); }

Spécification de paramètres facultatifs

La méthode Query prend en charge plusieurs paramètres facultatifs. Par exemple, vous pouvez le cas échéant affiner le résultat de la requête précédente pour renvoyer les réponses des deux semaines écoulées en spécifiant une condition. La condition est appelée condition de clé de tri parce que DynamoDB évalue la condition de requête que vous spécifiez par rapport à la clé de tri de la clé primaire. Vous pouvez spécifier d'autres paramètres facultatifs pour récupérer uniquement une liste spécifique d'attributs des éléments du résultat de la requête. Pour plus d'informations, consultez Requête.

L'exemple de code C# suivant récupère les réponses des threads de forum publées au cours des 15 derniers jours. L'échantillon spécifie les paramètres facultatifs suivants :

  • Un paramètre KeyConditionExpression pour récupérer uniquement les réponses des 15 derniers jours.

  • Un paramètre ProjectionExpression pour spécifier une liste d'attributs à récupérer pour les éléments du résultat de la requête.

  • Un paramètre ConsistentRead pour exécuter une lecture à cohérence forte.

Exemple
DateTime twoWeeksAgoDate = DateTime.UtcNow - TimeSpan.FromDays(15); string twoWeeksAgoString = twoWeeksAgoDate.ToString(AWSSDKUtils.ISO8601DateFormat); var request = new QueryRequest { TableName = "Reply", KeyConditionExpression = "Id = :v_Id and ReplyDateTime > :v_twoWeeksAgo", ExpressionAttributeValues = new Dictionary<string, AttributeValue> { {":v_Id", new AttributeValue { S = "Amazon DynamoDB#DynamoDB Thread 2" }}, {":v_twoWeeksAgo", new AttributeValue { S = twoWeeksAgoString }} }, ProjectionExpression = "Subject, ReplyDateTime, PostedBy", ConsistentRead = true }; var response = client.Query(request); foreach (Dictionary<string, AttributeValue> item in response.Items) { // Process the result. PrintItem(item); }

Vous pouvez aussi limiter le cas échéant la taille de la page ou le nombre d'éléments par page, en ajoutant le paramètre facultatif Limit. Chaque fois que vous exécutez la méthode Query, vous obtenez une page de résultats avec le nombre d'éléments spécifié. Pour récupérer la page suivante, vous exécutez à nouveau la méthode Query en fournissant la valeur de clé primaire du dernier élément de la page précédente afin que la méthode puisse retourner l'ensemble d'éléments suivant. Vous fournissez ces informations dans la demande en définissant la propriété ExclusiveStartKey. Au départ, cette propriété peut être null. Pour récupérer les pages suivantes, vous devez mettre à jour cette valeur de propriété avec la clé primaire du dernier élément de la page précédente.

L'exemple de code C# interroge la table Reply. Dans la demande, il spécifie les paramètres facultatifs Limit et ExclusiveStartKey. La boucle do/while continue d'analyser une page à la fois jusqu'à ce que LastEvaluatedKey renvoie une valeur null.

Exemple
Dictionary<string,AttributeValue> lastKeyEvaluated = null; do { var request = new QueryRequest { TableName = "Reply", KeyConditionExpression = "Id = :v_Id", ExpressionAttributeValues = new Dictionary<string, AttributeValue> { {":v_Id", new AttributeValue { S = "Amazon DynamoDB#DynamoDB Thread 2" }} }, // Optional parameters. Limit = 1, ExclusiveStartKey = lastKeyEvaluated }; var response = client.Query(request); // Process the query result. foreach (Dictionary<string, AttributeValue> item in response.Items) { PrintItem(item); } lastKeyEvaluated = response.LastEvaluatedKey; } while (lastKeyEvaluated != null && lastKeyEvaluated.Count != 0);

Exemple : exécution d'une requête à l'aide du AWS SDK for .NET

Les tables suivantes stockent des informations sur un ensemble de forums. Pour de plus amples informations, veuillez consulter Création de tables et chargement de données pour des exemples de code dans DynamoDB.

Exemple
Forum ( Name, ... ) Thread ( ForumName, Subject, Message, LastPostedBy, LastPostDateTime, ...) Reply ( Id, ReplyDateTime, Message, PostedBy, ...)

Dans cet exemple, vous exécutez des variantes de recherche de réponses pour une unité d’exécution « DynamoDB Thread 1 » dans le forum « DynamoDB ».

  • Recherchez des réponses pour un thread.

  • Recherchez des réponses pour un thread. Spécifiez le paramètre de requête Limit pour définir la taille de la page.

    Cette fonction illustre l'utilisation de la pagination pour traiter le résultat de plusieurs pages. DynamoDB a une limite de taille de page et, si votre résultat dépasse la taille de la page, vous obtenez uniquement la première page de résultats. Ce modèle de codage garantit que votre code traite toutes les pages dans le résultat de la requête.

  • Recherchez des réponses au cours des 15 derniers jours.

  • Recherchez des réponses dans une plage de dates spécifique.

    Les deux requêtes précédentes montrent comment vous pouvez spécifier les conditions de clé de tri pour affiner les résultats de la requête et utiliser d'autres paramètres de requête facultatifs.

Pour step-by-step obtenir des instructions sur le test de l'exemple suivant, reportez-vous àExemples de code .NET.

using System; using System.Collections.Generic; using Amazon.DynamoDBv2; using Amazon.DynamoDBv2.Model; using Amazon.Runtime; using Amazon.Util; namespace com.amazonaws.codesamples { class LowLevelQuery { private static AmazonDynamoDBClient client = new AmazonDynamoDBClient(); static void Main(string[] args) { try { // Query a specific forum and thread. string forumName = "Amazon DynamoDB"; string threadSubject = "DynamoDB Thread 1"; FindRepliesForAThread(forumName, threadSubject); FindRepliesForAThreadSpecifyOptionalLimit(forumName, threadSubject); FindRepliesInLast15DaysWithConfig(forumName, threadSubject); FindRepliesPostedWithinTimePeriod(forumName, threadSubject); Console.WriteLine("Example complete. To continue, press Enter"); Console.ReadLine(); } catch (AmazonDynamoDBException e) { Console.WriteLine(e.Message); Console.ReadLine(); } catch (AmazonServiceException e) { Console.WriteLine(e.Message); Console.ReadLine(); } catch (Exception e) { Console.WriteLine(e.Message); Console.ReadLine(); } } private static void FindRepliesPostedWithinTimePeriod(string forumName, string threadSubject) { Console.WriteLine("*** Executing FindRepliesPostedWithinTimePeriod() ***"); string replyId = forumName + "#" + threadSubject; // You must provide date value based on your test data. DateTime startDate = DateTime.UtcNow - TimeSpan.FromDays(21); string start = startDate.ToString(AWSSDKUtils.ISO8601DateFormat); // You provide date value based on your test data. DateTime endDate = DateTime.UtcNow - TimeSpan.FromDays(5); string end = endDate.ToString(AWSSDKUtils.ISO8601DateFormat); var request = new QueryRequest { TableName = "Reply", ReturnConsumedCapacity = "TOTAL", KeyConditionExpression = "Id = :v_replyId and ReplyDateTime between :v_start and :v_end", ExpressionAttributeValues = new Dictionary<string, AttributeValue> { {":v_replyId", new AttributeValue { S = replyId }}, {":v_start", new AttributeValue { S = start }}, {":v_end", new AttributeValue { S = end }} } }; var response = client.Query(request); Console.WriteLine("\nNo. of reads used (by query in FindRepliesPostedWithinTimePeriod) {0}", response.ConsumedCapacity.CapacityUnits); foreach (Dictionary<string, AttributeValue> item in response.Items) { PrintItem(item); } Console.WriteLine("To continue, press Enter"); Console.ReadLine(); } private static void FindRepliesInLast15DaysWithConfig(string forumName, string threadSubject) { Console.WriteLine("*** Executing FindRepliesInLast15DaysWithConfig() ***"); string replyId = forumName + "#" + threadSubject; DateTime twoWeeksAgoDate = DateTime.UtcNow - TimeSpan.FromDays(15); string twoWeeksAgoString = twoWeeksAgoDate.ToString(AWSSDKUtils.ISO8601DateFormat); var request = new QueryRequest { TableName = "Reply", ReturnConsumedCapacity = "TOTAL", KeyConditionExpression = "Id = :v_replyId and ReplyDateTime > :v_interval", ExpressionAttributeValues = new Dictionary<string, AttributeValue> { {":v_replyId", new AttributeValue { S = replyId }}, {":v_interval", new AttributeValue { S = twoWeeksAgoString }} }, // Optional parameter. ProjectionExpression = "Id, ReplyDateTime, PostedBy", // Optional parameter. ConsistentRead = true }; var response = client.Query(request); Console.WriteLine("No. of reads used (by query in FindRepliesInLast15DaysWithConfig) {0}", response.ConsumedCapacity.CapacityUnits); foreach (Dictionary<string, AttributeValue> item in response.Items) { PrintItem(item); } Console.WriteLine("To continue, press Enter"); Console.ReadLine(); } private static void FindRepliesForAThreadSpecifyOptionalLimit(string forumName, string threadSubject) { Console.WriteLine("*** Executing FindRepliesForAThreadSpecifyOptionalLimit() ***"); string replyId = forumName + "#" + threadSubject; Dictionary<string, AttributeValue> lastKeyEvaluated = null; do { var request = new QueryRequest { TableName = "Reply", ReturnConsumedCapacity = "TOTAL", KeyConditionExpression = "Id = :v_replyId", ExpressionAttributeValues = new Dictionary<string, AttributeValue> { {":v_replyId", new AttributeValue { S = replyId }} }, Limit = 2, // The Reply table has only a few sample items. So the page size is smaller. ExclusiveStartKey = lastKeyEvaluated }; var response = client.Query(request); Console.WriteLine("No. of reads used (by query in FindRepliesForAThreadSpecifyLimit) {0}\n", response.ConsumedCapacity.CapacityUnits); foreach (Dictionary<string, AttributeValue> item in response.Items) { PrintItem(item); } lastKeyEvaluated = response.LastEvaluatedKey; } while (lastKeyEvaluated != null && lastKeyEvaluated.Count != 0); Console.WriteLine("To continue, press Enter"); Console.ReadLine(); } private static void FindRepliesForAThread(string forumName, string threadSubject) { Console.WriteLine("*** Executing FindRepliesForAThread() ***"); string replyId = forumName + "#" + threadSubject; var request = new QueryRequest { TableName = "Reply", ReturnConsumedCapacity = "TOTAL", KeyConditionExpression = "Id = :v_replyId", ExpressionAttributeValues = new Dictionary<string, AttributeValue> { {":v_replyId", new AttributeValue { S = replyId }} } }; var response = client.Query(request); Console.WriteLine("No. of reads used (by query in FindRepliesForAThread) {0}\n", response.ConsumedCapacity.CapacityUnits); foreach (Dictionary<string, AttributeValue> item in response.Items) { PrintItem(item); } Console.WriteLine("To continue, press Enter"); Console.ReadLine(); } private static void PrintItem( Dictionary<string, AttributeValue> attributeList) { foreach (KeyValuePair<string, AttributeValue> kvp in attributeList) { string attributeName = kvp.Key; AttributeValue value = kvp.Value; Console.WriteLine( attributeName + " " + (value.S == null ? "" : "S=[" + value.S + "]") + (value.N == null ? "" : "N=[" + value.N + "]") + (value.SS == null ? "" : "SS=[" + string.Join(",", value.SS.ToArray()) + "]") + (value.NS == null ? "" : "NS=[" + string.Join(",", value.NS.ToArray()) + "]") ); } Console.WriteLine("************************************************"); } } }