DynamoDB: consultas

Las consultas ubican elementos o índices secundarios a través de claves primarias. Realizar una consulta requiere una clave de partición y un valor específico, o una clave de clasificación y un valor; con la opción de filtrar con comparaciones. El comportamiento predeterminado de una consulta consiste en devolver todos los atributos de los elementos asociados con la clave principal proporcionada. Sin embargo, puede especificar los atributos deseados con elProjectionExpression parámetro.

Una consulta utiliza el KeyConditionExpressionparámetros para seleccionar elementos, lo que requiere proporcionar el nombre y el valor de la clave de partición en forma de una condición de igualdad. También tiene la opción de proporcionar una condición adicional para cualquier clave de clasificación presente.

Algunos ejemplos de las condiciones clave de clasificación son:

No Señor Descripción de condición
1

x = y

Se evalúa como verdadero si el atributo x es igual a y.

2

x < y

Se evalúa como verdadero si x es menor que y.

3

x <= y

Se evalúa como verdadero si x es menor o igual que y.

4

x > y

Se evalúa como verdadero si x es mayor que y.

5

x >= y

Se evalúa como verdadero si x es mayor o igual que y.

6

x BETWEEN y AND z

Se evalúa como verdadero si x es tanto> = y como <= z.

DynamoDB también admite las siguientes funciones: begins_with (x, substr)

Se evalúa como verdadero si el atributo x comienza con la cadena especificada.

Las siguientes condiciones deben cumplir con ciertos requisitos:

  • Los nombres de los atributos deben comenzar con un carácter dentro del conjunto az o AZ.

  • El segundo carácter de un nombre de atributo debe estar en el conjunto az, AZ o 0-9.

  • Los nombres de atributos no pueden utilizar palabras reservadas.

Los nombres de atributos que no cumplan con las restricciones anteriores pueden definir un marcador de posición.

La consulta se procesa realizando recuperaciones en orden de clave de clasificación y utilizando cualquier condición y expresión de filtro presente. Las consultas siempre devuelven un conjunto de resultados y, si no hay coincidencias, devuelve uno vacío.

Los resultados siempre se devuelven en orden de clave de clasificación y en orden basado en el tipo de datos con el valor predeterminado modificable como orden ascendente.

Consultando con Java

Las consultas en Java le permiten consultar tablas e índices secundarios. Requieren la especificación de claves de partición y condiciones de igualdad, con la opción de especificar condiciones y claves de clasificación.

Los pasos generales requeridos para una consulta en Java incluyen crear una instancia de clase DynamoDB, instancia de clase Table para la tabla de destino y llamar al método de consulta de la instancia Table para recibir el objeto de consulta.

La respuesta a la consulta contiene un ItemCollection objeto que proporciona todos los artículos devueltos.

El siguiente ejemplo demuestra consultas detalladas:

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

El método de consulta admite una amplia variedad de parámetros opcionales. El siguiente ejemplo demuestra cómo utilizar estos 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()); 
}

También puede revisar el siguiente ejemplo más grande.

Note- El siguiente programa puede asumir una fuente de datos creada previamente. Antes de intentar ejecutar, adquiera bibliotecas de soporte y cree las fuentes de datos necesarias (tablas con las características requeridas u otras fuentes referenciadas).

Este ejemplo también utiliza Eclipse IDE, un archivo de credenciales de AWS y AWS Toolkit dentro de un proyecto 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()); 
      } 
   } 
}