Consulta de tablas e índices: .NET - Amazon DynamoDB

Las traducciones son generadas a través de traducción automática. En caso de conflicto entre la traducción y la version original de inglés, prevalecerá la version en inglés.

Consulta de tablas e índices: .NET

La operación Query permite consultar una tabla o un índice secundario en Amazon DynamoDB. Debe proporcionar un valor de clave de partición y una condición de igualdad. Si la tabla o el índice tienen una clave de ordenación, puede refinar los resultados proporcionando un valor de clave de ordenación y una condición.

Los siguientes son los pasos para consultar una tabla mediante la AWS SDK for .NET API de bajo nivel.

  1. Cree una instancia de la clase AmazonDynamoDBClient.

  2. Cree una instancia de la clase QueryRequest y proporcione los parámetros de la operación de consulta.

  3. Ejecute el método Query y proporcione el objeto QueryRequest que creó en el paso anterior.

    La respuesta incluye el objeto QueryResult que proporciona todos los elementos devueltos por la consulta.

En el siguiente ejemplo de código C# se ponen en práctica las tareas anteriores. Por ejemplo, suponga que tiene una tabla Reply en la que se almacenan las respuestas de las conversaciones de un foro. Para obtener más información, consulte Creación de tablas y carga de datos para ejemplos de código en DynamoDB.

ejemplo
Reply Id, ReplyDateTime, ... )

Cada conversación de un foro tiene un identificador único y puede tener cero o más respuestas. Por lo tanto, la clave principal consta de la clave de partición (Id) y la clave de ordenación (ReplyDateTime).

La siguiente consulta recupera todas las respuestas del asunto de una conversación concreta. La consulta necesita el nombre de la tabla y el valor de Subject.

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

Especificación de parámetros opcionales

El método Query admite varios parámetros opcionales. Por ejemplo, si lo desea puede especificar una condición para delimitar el resultado de la consulta anterior y que se devuelvan las respuestas de las dos últimas semanas. La condición se denomina condición de clave de ordenación, ya que DynamoDB evalúa la condición de consulta que se ha especificado con respecto a la clave de ordenación de la clave principal. Puede especificar otros parámetros opcionales para recuperar solo una lista específica de atributos de los elementos presentes en el resultado de la consulta. Para obtener más información, consulte Query.

En el siguiente ejemplo de código C# se recuperan las respuestas de las conversaciones de un foro publicadas en los últimos 15 días. En el ejemplo se especifican los parámetros opcionales siguientes:

  • Una expresión KeyConditionExpression para recuperar solamente las respuestas de los últimos 15 días.

  • Un parámetro ProjectionExpression para especificar una lista de atributos que deben recuperarse para los elementos presentes en el resultado de la consulta.

  • Un parámetro ConsistentRead para realizar una lectura de consistencia alta.

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

Además, si lo desea puede limitar el tamaño de la página, es decir, el número de elementos por página, agregando el parámetro opcional Limit. Cada vez que se ejecuta el método Query, se obtiene una página de resultados con el número de elementos especificado. Para recuperar la página siguiente, debe volver a ejecutar el método Query proporcionando el valor de clave principal del último elemento de la página anterior, para que el método devuelva el siguiente conjunto de elementos. Esta información se proporciona dentro de la solicitud estableciendo la propiedad ExclusiveStartKey. Inicialmente, esta propiedad puede ser null. Para recuperar las páginas siguientes, debe actualizar el valor de esta propiedad de modo que tome el valor de la clave principal del último elemento de la página anterior.

En el siguiente ejemplo de C# se consulta la tabla Reply. En la solicitud, se especifican los parámetros opcionales Limit y ExclusiveStartKey. El bucle do/while continúa examinando una página cada vez hasta que LastEvaluatedKey devuelve el valor null.

ejemplo
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);

Ejemplo: realizar consultas mediante el AWS SDK for .NET

En las siguientes tablas se almacena información sobre una colección de foros. Para obtener más información, consulte Creación de tablas y carga de datos para ejemplos de código en DynamoDB.

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

En este ejemplo, puede ejecutar variaciones de la búsqueda de respuestas para la conversación "DynamoDB Thread 1" del foro "DynamoDB".

  • Buscar las respuestas a una conversación.

  • Buscar las respuestas a una conversación. Especificar el parámetro Limit de la consulta para establecer el tamaño de la página.

    Esta función ilustra el uso de la paginación para procesar resultados en varias páginas. DynamoDB tiene un límite de tamaño de página. Si el resultado supera este tamaño de página, solo se obtiene la primera página de resultados. Este patrón de codificación garantiza que el código procese todas las páginas del resultado de la consulta.

  • Buscar las respuestas de los últimos 15 días.

  • Buscar las respuestas de un intervalo de fechas determinado.

    En las dos consultas anteriores se muestra cómo especificar condiciones de clave de ordenación para delimitar los resultados de la consulta y utilizar otros parámetros de consulta opcionales.

Para step-by-step obtener instrucciones para probar el siguiente ejemplo, consulteEjemplos de código .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("************************************************"); } } }