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