Consulta de tablas e índices: Java - 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: Java

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.

nota

AWS SDK for Java También proporciona un modelo de persistencia de objetos que le permite asignar las clases del lado del cliente a tablas de DynamoDB. Este enfoque puede reducir la cantidad de código que hay que escribir. Para obtener más información, consulte Java 1.x: DynamoDBMapper.

Los siguientes son los pasos para recuperar un elemento mediante la API de documentos. AWS SDK for Java

  1. Cree una instancia de la clase DynamoDB.

  2. Cree una instancia de la clase Table para representar la tabla que desea usar.

  3. Llame al método query de la instancia de Table. Debe especificar el valor de clave de partición de los elementos que desea recuperar, junto con los parámetros de consulta opcionales.

La respuesta incluye un objeto ItemCollection que proporciona todos los elementos devueltos por la consulta.

En el siguiente ejemplo de código Java se muestran 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.

Reply ( Id, ReplyDateTime, ... )

Cada conversación de un foro tiene un identificador único y puede tener cero o más respuestas. Por lo tanto, el atributo Id de la tabla Reply consta del nombre del foro y del asunto del foro. La clave principal compuesta de la tabla consta de Id (clave de partición) y ReplyDateTime (clave de ordenación).

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
AmazonDynamoDB client = AmazonDynamoDBClientBuilder.standard() .withRegion(Regions.US_WEST_2).build(); DynamoDB dynamoDB = new DynamoDB(client); Table table = dynamoDB.getTable("Reply"); QuerySpec spec = new QuerySpec() .withKeyConditionExpression("Id = :v_id") .withValueMap(new ValueMap() .withString(":v_id", "Amazon DynamoDB#DynamoDB Thread 1")); ItemCollection<QueryOutcome> items = table.query(spec); Iterator<Item> iterator = items.iterator(); Item item = null; while (iterator.hasNext()) { item = iterator.next(); System.out.println(item.toJSONPretty()); }

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 los resultados 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.

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

  • Una expresión KeyConditionExpression para recuperar las respuestas de un foro de debate concreto (clave de partición) y, dentro de ese conjunto de elementos, las respuestas que se han publicado en los últimos 15 días (clave de ordenación).

  • Una expresión FilterExpression para devolver solamente las respuestas de un usuario determinado. El filtro se aplica después de procesar la consulta, pero antes de devolver los resultados al usuario.

  • Un mapa ValueMap para definir los valores reales de los marcadores de posición de KeyConditionExpression.

  • ConsistentRead establecido en true, para solicitar una lectura de consistencia alta.

En este ejemplo se utiliza un objeto QuerySpec que proporciona acceso a todos los parámetros de entrada de bajo nivel de Query.

ejemplo
Table table = dynamoDB.getTable("Reply"); long twoWeeksAgoMilli = (new Date()).getTime() - (15L*24L*60L*60L*1000L); Date twoWeeksAgo = new Date(); twoWeeksAgo.setTime(twoWeeksAgoMilli); SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSS'Z'"); String twoWeeksAgoStr = df.format(twoWeeksAgo); QuerySpec spec = new QuerySpec() .withKeyConditionExpression("Id = :v_id and ReplyDateTime > :v_reply_dt_tm") .withFilterExpression("PostedBy = :v_posted_by") .withValueMap(new ValueMap() .withString(":v_id", "Amazon DynamoDB#DynamoDB Thread 1") .withString(":v_reply_dt_tm", twoWeeksAgoStr) .withString(":v_posted_by", "User B")) .withConsistentRead(true); ItemCollection<QueryOutcome> items = table.query(spec); Iterator<Item> iterator = items.iterator(); while (iterator.hasNext()) { System.out.println(iterator.next().toJSONPretty()); }

Además, si lo desea puede limitar el número de elementos por página con el método withMaxPageSize. Cuando se llama al método query, se obtiene una ItemCollection que contiene los elementos resultantes. A continuación, puede recorrer los resultados paso a paso, procesando una página cada vez, hasta que no queden más páginas.

En el siguiente ejemplo de código Java se modifica la especificación de consulta mostrada anteriormente. Esta vez, la especificación de consulta utiliza el método withMaxPageSize. La clase Page proporciona un iterador que permite que el código procese los elementos de cada página.

ejemplo
spec.withMaxPageSize(10); ItemCollection<QueryOutcome> items = table.query(spec); // Process each page of results int pageNum = 0; for (Page<Item, QueryOutcome> page : items.pages()) { System.out.println("\nPage: " + ++pageNum); // Process each item on the current page Iterator<Item> item = page.iterator(); while (item.hasNext()) { System.out.println(item.next().toJSONPretty()); } }

Ejemplo: consulta mediante Java

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.

nota

Además, SDK para Java proporciona un modelo de persistencia de objetos, que le permite mapear las clases del lado del cliente a las tablas de DynamoDB. Este enfoque puede reducir la cantidad de código que hay que escribir. Para obtener más información, consulte Java 1.x: DynamoDBMapper.

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

En este ejemplo de código Java, puede ejecutar variaciones de 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, especificando un límite para el número de elementos que contendrá cada página de resultados. Si el número de elementos del conjunto de resultados supera el tamaño de página, se obtiene únicamente 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.

nota

En este ejemplo de código se supone que ya ha cargado datos en DynamoDB para su cuenta siguiendo las instrucciones de la sección Creación de tablas y carga de datos para ejemplos de código en DynamoDB.

Para step-by-step obtener instrucciones sobre cómo ejecutar el siguiente ejemplo, consulteEjemplos de código Java.

package com.amazonaws.codesamples.document; import java.text.SimpleDateFormat; import java.util.Date; import java.util.Iterator; import com.amazonaws.services.dynamodbv2.AmazonDynamoDB; import com.amazonaws.services.dynamodbv2.AmazonDynamoDBClientBuilder; import com.amazonaws.services.dynamodbv2.document.DynamoDB; import com.amazonaws.services.dynamodbv2.document.Item; import com.amazonaws.services.dynamodbv2.document.ItemCollection; import com.amazonaws.services.dynamodbv2.document.Page; import com.amazonaws.services.dynamodbv2.document.QueryOutcome; import com.amazonaws.services.dynamodbv2.document.Table; import com.amazonaws.services.dynamodbv2.document.spec.QuerySpec; import com.amazonaws.services.dynamodbv2.document.utils.ValueMap; public class DocumentAPIQuery { static AmazonDynamoDB client = AmazonDynamoDBClientBuilder.standard().build(); static DynamoDB dynamoDB = new DynamoDB(client); static String tableName = "Reply"; public static void main(String[] args) throws Exception { String forumName = "Amazon DynamoDB"; String threadSubject = "DynamoDB Thread 1"; findRepliesForAThread(forumName, threadSubject); findRepliesForAThreadSpecifyOptionalLimit(forumName, threadSubject); findRepliesInLast15DaysWithConfig(forumName, threadSubject); findRepliesPostedWithinTimePeriod(forumName, threadSubject); findRepliesUsingAFilterExpression(forumName, threadSubject); } private static void findRepliesForAThread(String forumName, String threadSubject) { Table table = dynamoDB.getTable(tableName); String replyId = forumName + "#" + threadSubject; QuerySpec spec = new QuerySpec().withKeyConditionExpression("Id = :v_id") .withValueMap(new ValueMap().withString(":v_id", replyId)); ItemCollection<QueryOutcome> items = table.query(spec); System.out.println("\nfindRepliesForAThread results:"); Iterator<Item> iterator = items.iterator(); while (iterator.hasNext()) { System.out.println(iterator.next().toJSONPretty()); } } private static void findRepliesForAThreadSpecifyOptionalLimit(String forumName, String threadSubject) { Table table = dynamoDB.getTable(tableName); String replyId = forumName + "#" + threadSubject; QuerySpec spec = new QuerySpec().withKeyConditionExpression("Id = :v_id") .withValueMap(new ValueMap().withString(":v_id", replyId)).withMaxPageSize(1); ItemCollection<QueryOutcome> items = table.query(spec); System.out.println("\nfindRepliesForAThreadSpecifyOptionalLimit results:"); // Process each page of results int pageNum = 0; for (Page<Item, QueryOutcome> page : items.pages()) { System.out.println("\nPage: " + ++pageNum); // Process each item on the current page Iterator<Item> item = page.iterator(); while (item.hasNext()) { System.out.println(item.next().toJSONPretty()); } } } private static void findRepliesInLast15DaysWithConfig(String forumName, String threadSubject) { Table table = dynamoDB.getTable(tableName); long twoWeeksAgoMilli = (new Date()).getTime() - (15L * 24L * 60L * 60L * 1000L); Date twoWeeksAgo = new Date(); twoWeeksAgo.setTime(twoWeeksAgoMilli); SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSS'Z'"); String twoWeeksAgoStr = df.format(twoWeeksAgo); String replyId = forumName + "#" + threadSubject; QuerySpec spec = new QuerySpec().withProjectionExpression("Message, ReplyDateTime, PostedBy") .withKeyConditionExpression("Id = :v_id and ReplyDateTime <= :v_reply_dt_tm") .withValueMap(new ValueMap().withString(":v_id", replyId).withString(":v_reply_dt_tm", twoWeeksAgoStr)); ItemCollection<QueryOutcome> items = table.query(spec); System.out.println("\nfindRepliesInLast15DaysWithConfig results:"); Iterator<Item> iterator = items.iterator(); while (iterator.hasNext()) { System.out.println(iterator.next().toJSONPretty()); } } private static void findRepliesPostedWithinTimePeriod(String forumName, String threadSubject) { Table table = dynamoDB.getTable(tableName); long startDateMilli = (new Date()).getTime() - (15L * 24L * 60L * 60L * 1000L); long endDateMilli = (new Date()).getTime() - (5L * 24L * 60L * 60L * 1000L); java.text.SimpleDateFormat df = new java.text.SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSS'Z'"); String startDate = df.format(startDateMilli); String endDate = df.format(endDateMilli); String replyId = forumName + "#" + threadSubject; QuerySpec spec = new QuerySpec().withProjectionExpression("Message, ReplyDateTime, PostedBy") .withKeyConditionExpression("Id = :v_id and ReplyDateTime between :v_start_dt and :v_end_dt") .withValueMap(new ValueMap().withString(":v_id", replyId).withString(":v_start_dt", startDate) .withString(":v_end_dt", endDate)); ItemCollection<QueryOutcome> items = table.query(spec); System.out.println("\nfindRepliesPostedWithinTimePeriod results:"); Iterator<Item> iterator = items.iterator(); while (iterator.hasNext()) { System.out.println(iterator.next().toJSONPretty()); } } private static void findRepliesUsingAFilterExpression(String forumName, String threadSubject) { Table table = dynamoDB.getTable(tableName); String replyId = forumName + "#" + threadSubject; QuerySpec spec = new QuerySpec().withProjectionExpression("Message, ReplyDateTime, PostedBy") .withKeyConditionExpression("Id = :v_id").withFilterExpression("PostedBy = :v_postedby") .withValueMap(new ValueMap().withString(":v_id", replyId).withString(":v_postedby", "User B")); ItemCollection<QueryOutcome> items = table.query(spec); System.out.println("\nfindRepliesUsingAFilterExpression results:"); Iterator<Item> iterator = items.iterator(); while (iterator.hasNext()) { System.out.println(iterator.next().toJSONPretty()); } } }