DynamoDB-クエリ

クエリは、主キーを介してアイテムまたはセカンダリインデックスを検索します。クエリを実行するには、パーティションキーと特定の値、または並べ替えキーと値が必要です。比較でフィルタリングするオプションがあります。クエリのデフォルトの動作は、提供された主キーに関連付けられたアイテムのすべての属性を返すことで構成されます。ただし、を使用して目的の属性を指定できます。ProjectionExpression パラメータ。

クエリは KeyConditionExpression項目を選択するためのパラメーター。これには、等式条件の形式でパーティションキーの名前と値を指定する必要があります。存在するソートキーに追加の条件を提供するオプションもあります。

ソートキー条件のいくつかの例は次のとおりです。

シニア番号 状態と説明
1

x = y

属性xがyに等しい場合、trueと評価されます。

2

x < y

xがyより小さい場合、trueと評価されます。

3

x <= y

xがy以下の場合、trueと評価されます。

4

x > y

xがyより大きい場合、trueと評価されます。

5

x >= y

xがy以上の場合、trueと評価されます。

6

x BETWEEN y AND z

xが> = yであり、<= zである場合、trueと評価されます。

DynamoDBは、次の機能もサポートしています。 begins_with (x, substr)

属性xが指定された文字列で始まる場合、trueと評価されます。

以下の条件は、特定の要件に準拠する必要があります-

  • 属性名は、azまたはAZセット内の文字で始まる必要があります。

  • 属性名の2番目の文字は、az、AZ、または0〜9のセットに含まれている必要があります。

  • 属性名は予約語を使用できません。

上記の制約に準拠していない属性名は、プレースホルダーを定義できます。

クエリは、ソートキーの順序で取得を実行し、存在する条件とフィルター式を使用して処理します。クエリは常に結果セットを返し、一致しない場合は空の結果セットを返します。

結果は常にソートキー順で返され、データ型ベースの順序で、変更可能なデフォルトが昇順として返されます。

Javaでのクエリ

Javaでのクエリを使用すると、テーブルとセカンダリインデックスをクエリできます。パーティションキーと等価条件を指定する必要があり、ソートキーと条件を指定するオプションもあります。

Javaでのクエリに必要な一般的な手順には、DynamoDBクラスインスタンス、ターゲットテーブルのテーブルクラスインスタンスの作成、およびテーブルインスタンスのクエリメソッドを呼び出してクエリオブジェクトを受け取ることが含まれます。

クエリへの応答には、 ItemCollection 返されたすべてのアイテムを提供するオブジェクト。

次の例は、詳細なクエリを示しています-

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

クエリメソッドは、さまざまなオプションのパラメータをサポートしています。次の例は、これらのパラメータを利用する方法を示しています-

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

次の大きな例を確認することもできます。

Note−次のプログラムは、以前に作成されたデータソースを想定している場合があります。実行を試みる前に、サポートライブラリを取得し、必要なデータソース(必要な特性を持つテーブル、またはその他の参照ソース)を作成します。

この例では、Eclipse IDE、AWS認証情報ファイル、およびEclipse AWSJavaプロジェクト内のAWSToolkitも使用しています。

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