Consultar tabelas e índices: Java - Amazon DynamoDB

As traduções são geradas por tradução automática. Em caso de conflito entre o conteúdo da tradução e da versão original em inglês, a versão em inglês prevalecerá.

Consultar tabelas e índices: Java

A operação Query permite consultar uma tabela ou um índice secundário no Amazon DynamoDB. Você deve fornecer um valor de chave de partição e uma condição de igualdade. Se a tabela ou o índice tiver uma chave de classificação, você poderá refinar os resultados fornecendo um valor de chave de classificação e uma condição.

nota

O AWS SDK for Java também fornece um modelo de persistência de objetos, permitindo que você mapeie suas classes do lado do cliente para tabelas do DynamoDB. Essa abordagem pode reduzir a quantidade de código que você precisa escrever. Para ter mais informações, consulte Java 1.x: DynamoDBMapper.

A seguir estão as etapas para recuperar um item usando a API de AWS SDK for Java documentos.

  1. Crie uma instância da classe DynamoDB.

  2. Crie uma instância da classe Table para representar a tabela com a qual você deseja trabalhar.

  3. Chame o método query de instância de Table. Você deve especificar o valor da chave de partição dos itens que deseja recuperar, juntamente com todos os parâmetros de consulta opcionais.

A resposta inclui um objeto ItemCollection, que fornece todos os itens retornados pela consulta.

O exemplo de código Java a seguir demonstra as tarefas anteriores. O exemplo pressupõe que você tenha uma tabela Reply que armazena respostas para tópicos de fórum. Para ter mais informações, consulte Criar tabelas e carregar dados para exemplos de código no DynamoDB.

Reply ( Id, ReplyDateTime, ... )

Cada tópico de fórum tem um ID exclusivo e pode ter zero ou mais respostas. Portanto, o atributo Id da tabela Reply é composto pelo nome e pelo assunto do fórum. O Id (chave de partição) e a ReplyDateTime (chave de classificação) compõem a chave primária composta da tabela.

A consulta a seguir recupera todas as respostas de um assunto de conversa específico. A consulta requer o nome da tabela e o valor de Subject.

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

Especificar parâmetros opcionais

O método query aceita vários parâmetros opcionais. Por exemplo, você pode opcionalmente restringir os resultados na consulta anterior para retornar respostas nas últimas duas semanas, especificando uma condição. A condição é chamada de condição de chave de classificação, pois o DynamoDB avalia a condição de consulta que você especifica de acordo com a chave de classificação da chave primária. É possível especificar outros parâmetros opcionais para recuperar apenas uma lista específica de atributos dos itens no resultado da consulta.

O exemplo de código Java a seguir recupera respostas a tópicos de threads do fórum publicadas nos últimos 15 dias. O exemplo especifica os parâmetros opcionais usando o seguinte:

  • Uma KeyConditionExpression para recuperar as respostas de um fórum de discussão específico (chave de partição) e, dentro desse conjunto de itens, as respostas que foram postadas nos últimos 15 dias (chave de classificação).

  • Uma FilterExpression para retornar apenas as respostas de um usuário específico. O filtro é aplicado depois que a consulta é processada, mas antes que os resultados sejam retornados ao usuário.

  • Um ValueMap para definir os valores reais dos espaços reservados de KeyConditionExpression.

  • Uma configuração de ConsistentRead de true, para solicitar uma leitura fortemente consistente.

Este exemplo usa um objeto QuerySpec que dá acesso a todos os parâmetros de entrada de baixo nível de Query.

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

Opcionalmente, você também pode limitar o número de itens por página usando o método withMaxPageSize. Quando você chama o método query, você recebe uma ItemCollection que contém os itens resultantes. Em seguida, você poderá percorrer os resultados, processamento uma página por vez, até há não haja mais páginas.

O exemplo de código Java a seguir modifica a especificação de consulta mostrada anteriormente. Dessa vez, a especificação de consulta usa o método withMaxPageSize. A classe Page fornece um iterador que permite que o código processe os itens em cada página.

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

Exemplo: consulta usando Java

As tabelas a seguir armazenam informações sobre um conjunto de fóruns. Para ter mais informações, consulte Criar tabelas e carregar dados para exemplos de código no DynamoDB.

nota

O SDK for Java também fornece um modelo de persistência de objetos que permite que você mapeie suas classes do lado do cliente para tabelas do DynamoDB. Essa abordagem pode reduzir a quantidade de código que você precisa escrever. Para ter mais informações, consulte Java 1.x: DynamoDBMapper.

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

Neste exemplo de código Java, você executa variações de Encontrar respostas para um thread "DynamoDB Thread 1" no fórum "DynamoDB".

  • Encontrar respostas para um tópico.

  • Encontre respostas para um tópico, especificando um limite sobre o número de itens por página de resultados. Se o número de itens no conjunto de resultados exceder o tamanho da página, você receberá apenas a primeira página de resultados. Esse padrão de codificação garante que o código processe todas as páginas no resultado da consulta.

  • Encontrar respostas nos últimos 15 dias.

  • Encontrar respostas em um intervalo de datas específico.

    As duas consultas anteriores mostram como você pode especificar condições de chave de classificação para restringir os resultados da consulta e usar outros parâmetros de consulta opcionais.

nota

Este exemplo de código pressupõe que você já carregou dados no DynamoDB para sua conta seguindo as instruções na seção Criar tabelas e carregar dados para exemplos de código no DynamoDB.

Para step-by-step obter instruções sobre como executar o exemplo a seguir, consulteExemplos 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()); } } }