DynamoDB - Interrogazione

Le query individuano elementi o indici secondari tramite chiavi primarie. L'esecuzione di una query richiede una chiave di partizione e un valore specifico oppure una chiave e un valore di ordinamento; con la possibilità di filtrare con i confronti. Il comportamento predefinito di una query consiste nel restituire ogni attributo per gli elementi associati alla chiave primaria fornita. Tuttavia, è possibile specificare gli attributi desiderati conProjectionExpression parametro.

Una query utilizza l'estensione KeyConditionExpressionparametri per selezionare gli elementi, che richiede di fornire il nome e il valore della chiave di partizione sotto forma di una condizione di uguaglianza. Hai anche la possibilità di fornire una condizione aggiuntiva per qualsiasi codice di ordinamento presente.

Alcuni esempi delle condizioni chiave di ordinamento sono:

Suor n Descrizione della condizione
1

x = y

Risulta vero se l'attributo x è uguale a y.

2

x < y

Risulta vero se x è minore di y.

3

x <= y

Risulta vero se x è minore o uguale a y.

4

x > y

Risulta vero se x è maggiore di y.

5

x >= y

Risulta vero se x è maggiore o uguale a y.

6

x BETWEEN y AND z

Restituisce vero se x è sia> = y che <= z.

DynamoDB supporta anche le seguenti funzioni: begins_with (x, substr)

Restituisce true se l'attributo x inizia con la stringa specificata.

Le seguenti condizioni devono essere conformi a determinati requisiti:

  • I nomi degli attributi devono iniziare con un carattere all'interno del set az o AZ.

  • Il secondo carattere del nome di un attributo deve rientrare nell'insieme az, AZ o 0-9.

  • I nomi degli attributi non possono utilizzare parole riservate.

I nomi degli attributi non conformi ai vincoli di cui sopra possono definire un segnaposto.

La query viene elaborata eseguendo i recuperi in ordine di chiave di ordinamento e utilizzando qualsiasi condizione ed espressione di filtro presenti. Le query restituiscono sempre un set di risultati e, in assenza di corrispondenze, ne restituisce uno vuoto.

I risultati vengono sempre restituiti nell'ordine della chiave di ordinamento e nell'ordine basato sul tipo di dati con l'impostazione predefinita modificabile come ordine crescente.

Interrogare con Java

Le query in Java consentono di eseguire query su tabelle e indici secondari. Richiedono la specifica di chiavi di partizione e condizioni di uguaglianza, con la possibilità di specificare chiavi e condizioni di ordinamento.

I passaggi generali richiesti per una query in Java includono la creazione di un'istanza di classe DynamoDB, un'istanza di classe Table per la tabella di destinazione e la chiamata al metodo di query dell'istanza di Table per ricevere l'oggetto query.

La risposta alla query contiene un file ItemCollection oggetto che fornisce tutti gli articoli restituiti.

L'esempio seguente mostra l'esecuzione di query dettagliate:

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

Il metodo di query supporta un'ampia varietà di parametri opzionali. L'esempio seguente mostra come utilizzare questi parametri:

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

Puoi anche rivedere il seguente esempio più ampio.

Note- Il seguente programma può assumere un'origine dati creata in precedenza. Prima di tentare l'esecuzione, acquisire le librerie di supporto e creare le origini dati necessarie (tabelle con caratteristiche richieste o altre fonti di riferimento).

Questo esempio utilizza anche Eclipse IDE, un file delle credenziali AWS e AWS Toolkit all'interno di un progetto 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()); 
      } 
   } 
}