DynamoDB - Requête

Les requêtes localisent des éléments ou des index secondaires via des clés primaires. L'exécution d'une requête nécessite une clé de partition et une valeur spécifique, ou une clé de tri et une valeur; avec la possibilité de filtrer avec des comparaisons. Le comportement par défaut d'une requête consiste à renvoyer tous les attributs des éléments associés à la clé primaire fournie. Cependant, vous pouvez spécifier les attributs souhaités avec leProjectionExpression paramètre.

Une requête utilise le KeyConditionExpressionparamètres pour sélectionner des éléments, ce qui nécessite de fournir le nom et la valeur de la clé de partition sous la forme d'une condition d'égalité. Vous avez également la possibilité de fournir une condition supplémentaire pour les clés de tri présentes.

Quelques exemples de conditions de clé de tri sont:

Sr.Non Description de la condition
1

x = y

Il prend la valeur true si l'attribut x est égal à y.

2

x < y

Il prend la valeur true si x est inférieur à y.

3

x <= y

Il prend la valeur true si x est inférieur ou égal à y.

4

x > y

Il prend la valeur true si x est supérieur à y.

5

x >= y

Il prend la valeur true si x est supérieur ou égal à y.

6

x BETWEEN y AND z

Il prend la valeur true si x est à la fois> = y et <= z.

DynamoDB prend également en charge les fonctions suivantes: begins_with (x, substr)

Il prend la valeur true si l'attribut x commence par la chaîne spécifiée.

Les conditions suivantes doivent être conformes à certaines exigences -

  • Les noms d'attribut doivent commencer par un caractère dans l'ensemble az ou AZ.

  • Le deuxième caractère d'un nom d'attribut doit appartenir à l'ensemble az, AZ ou 0-9.

  • Les noms d'attribut ne peuvent pas utiliser de mots réservés.

Les noms d'attributs non conformes aux contraintes ci-dessus peuvent définir un espace réservé.

La requête est traitée en effectuant des extractions dans l'ordre des clés de tri et en utilisant toute condition et expression de filtre présentes. Les requêtes renvoient toujours un jeu de résultats et, en l'absence de correspondances, elles renvoient un jeu vide.

Les résultats retournent toujours dans l'ordre des clés de tri et dans l'ordre basé sur le type de données avec la valeur par défaut modifiable comme ordre croissant.

Interroger avec Java

Les requêtes en Java vous permettent d'interroger des tables et des index secondaires. Ils nécessitent la spécification des clés de partition et des conditions d'égalité, avec la possibilité de spécifier des clés de tri et des conditions.

Les étapes générales requises pour une requête en Java incluent la création d'une instance de classe DynamoDB, une instance de classe Table pour la table cible et l'appel de la méthode de requête de l'instance Table pour recevoir l'objet de requête.

La réponse à la requête contient un ItemCollection objet fournissant tous les articles retournés.

L'exemple suivant illustre une requête détaillée -

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

La méthode de requête prend en charge une grande variété de paramètres facultatifs. L'exemple suivant montre comment utiliser ces paramètres -

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

Vous pouvez également consulter l'exemple plus large suivant.

Note- Le programme suivant peut supposer une source de données précédemment créée. Avant d'essayer de l'exécuter, acquérez les bibliothèques de prise en charge et créez les sources de données nécessaires (tables avec les caractéristiques requises ou autres sources référencées).

Cet exemple utilise également Eclipse IDE, un fichier d'informations d'identification AWS et AWS Toolkit dans un projet 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()); 
      } 
   } 
}