DynamoDB - Consultando

As consultas localizam itens ou índices secundários por meio de chaves primárias. A realização de uma consulta requer uma chave de partição e valor específico ou uma chave e valor de classificação; com a opção de filtrar com comparações. O comportamento padrão de uma consulta consiste em retornar todos os atributos dos itens associados à chave primária fornecida. No entanto, você pode especificar os atributos desejados com oProjectionExpression parâmetro.

Uma consulta utiliza o KeyConditionExpressionparâmetros para selecionar itens, o que requer fornecer o nome da chave de partição e o valor na forma de uma condição de igualdade. Você também tem a opção de fornecer uma condição adicional para quaisquer chaves de classificação presentes.

Alguns exemplos das principais condições de classificação são -

Sr. Não Condição e descrição
1

x = y

Ele é avaliado como verdadeiro se o atributo x for igual a y.

2

x < y

Ele avalia como verdadeiro se x for menor que y.

3

x <= y

Ele avalia como verdadeiro se x for menor ou igual a y.

4

x > y

Ele avalia como verdadeiro se x for maior que y.

5

x >= y

Ele avalia como verdadeiro se x for maior ou igual a y.

6

x BETWEEN y AND z

Ele avalia como verdadeiro se x for> = y e <= z.

O DynamoDB também oferece suporte às seguintes funções: begins_with (x, substr)

Ele é avaliado como verdadeiro se o atributo x começar com a string especificada.

As seguintes condições devem estar em conformidade com certos requisitos -

  • Os nomes de atributos devem começar com um caractere dentro do conjunto az ou AZ.

  • O segundo caractere de um nome de atributo deve estar no conjunto az, AZ ou 0-9.

  • Nomes de atributos não podem usar palavras reservadas.

Nomes de atributos fora de conformidade com as restrições acima podem definir um espaço reservado.

A consulta é processada executando recuperações em ordem de chave de classificação e usando qualquer condição e expressão de filtro presente. As consultas sempre retornam um conjunto de resultados e, em nenhuma correspondência, retorna um conjunto vazio.

Os resultados sempre retornam na ordem da chave de classificação e na ordem baseada no tipo de dados, com o padrão modificável em ordem crescente.

Consultando com Java

As consultas em Java permitem que você consulte tabelas e índices secundários. Eles exigem a especificação de chaves de partição e condições de igualdade, com a opção de especificar chaves de classificação e condições.

As etapas gerais necessárias para uma consulta em Java incluem a criação de uma instância de classe DynamoDB, instância de classe Table para a tabela de destino e chamada do método de consulta da instância Table para receber o objeto de consulta.

A resposta à consulta contém um ItemCollection objeto fornecendo todos os itens devolvidos.

O exemplo a seguir demonstra uma consulta detalhada -

DynamoDB dynamoDB = new DynamoDB (
   new AmazonDynamoDBClient(new ProfileCredentialsProvider()));

Table table = dynamoDB.getTable("Response");  
   QuerySpec spec = new QuerySpec() 
   .withKeyConditionExpression("ID = :nn") 
.withValueMap(new ValueMap() 
   .withString(":nn", "Product Line 1#P1 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());
}

O método de consulta oferece suporte a uma ampla variedade de parâmetros opcionais. O exemplo a seguir demonstra como utilizar esses parâmetros -

Table table = dynamoDB.getTable("Response");  
QuerySpec spec = new QuerySpec() 
   .withKeyConditionExpression("ID = :nn and ResponseTM > :nn_responseTM")  
   .withFilterExpression("Author = :nn_author") 
   .withValueMap(new ValueMap()
   .withString(":nn", "Product Line 1#P1 Thread 1") 
   .withString(":nn_responseTM", twoWeeksAgoStr) 
   .withString(":nn_author", "Member 123"))
   .withConsistentRead(true);
   
ItemCollection<QueryOutcome> items = table.query(spec);  
Iterator<Item> iterator = items.iterator(); 

while (iterator.hasNext()) { 
   System.out.println(iterator.next().toJSONPretty()); 
}

Você também pode revisar o seguinte exemplo maior.

Note- O programa a seguir pode assumir uma fonte de dados criada anteriormente. Antes de tentar executar, adquira bibliotecas de suporte e crie as fontes de dados necessárias (tabelas com as características necessárias ou outras fontes referenciadas).

Este exemplo também usa Eclipse IDE, um arquivo de credenciais AWS e o AWS Toolkit em um projeto Eclipse AWS Java.

package com.amazonaws.codesamples.document;

import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Iterator;

import com.amazonaws.auth.profile.ProfileCredentialsProvider;
import com.amazonaws.services.dynamodbv2.AmazonDynamoDBClient;
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 QueryOpSample {
   static DynamoDB dynamoDB = new DynamoDB(
      new AmazonDynamoDBClient(new ProfileCredentialsProvider()));
   static String tableName = "Reply";  
   
   public static void main(String[] args) throws Exception { 
      String forumName = "PolyBlaster"; 
      String threadSubject = "PolyBlaster Thread 1";  
      getThreadReplies(forumName, threadSubject); 
   } 
   private static void getThreadReplies(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("\ngetThreadReplies results:"); 
      Iterator<Item> iterator = items.iterator(); 
      
      while (iterator.hasNext()) { 
         System.out.println(iterator.next().toJSONPretty()); 
      } 
   } 
}