Dynamodb-querying
DynamoDB-クエリ
クエリは、プライマリキーを通じてアイテムまたはセカンダリインデックスを検索します。 クエリを実行するには、パーティションキーと特定の値、またはソートキーと値が必要です。比較でフィルタリングするオプションがあります。 クエリのデフォルトの動作は、指定された主キーに関連付けられたアイテムのすべての属性を返すことです。 ただし、 ProjectionExpression パラメーターを使用して目的の属性を指定できます。
クエリは、 KeyConditionExpression パラメータを使用してアイテムを選択します。これには、パーティションキーの名前と値を等価条件の形式で指定する必要があります。 存在する並べ替えキーに追加条件を提供するオプションもあります。
ソートキー条件のいくつかの例は次のとおりです-
Sr.No | Condition & Description |
---|---|
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と評価されます。
次の条件は、特定の要件に準拠する必要があります-
- 属性名は、a-zまたはA-Zセット内の文字で始まる必要があります。
- 属性名の2番目の文字は、a-z、A-Z、または0-9セットに含まれている必要があります。
- 属性名には予約語を使用できません。
上記の制約に準拠していない属性名は、プレースホルダーを定義できます。
クエリは、ソートキー順で取得を実行し、存在する条件とフィルター式を使用して処理します。 クエリは常に結果セットを返し、一致しない場合は空の結果セットを返します。
結果は常に、ソートキーの順序、および昇順として変更可能なデフォルトを使用したデータ型ベースの順序で返されます。
Javaを使用したクエリ
Javaのクエリを使用すると、テーブルとセカンダリインデックスをクエリできます。 ソートキーと条件を指定するオプションとともに、パーティションキーと等価条件の指定が必要です。
Javaでのクエリに一般的に必要な手順には、DynamoDBクラスインスタンスの作成、ターゲットテーブルのTableクラスインスタンス、Tableオブジェクトのqueryメソッドの呼び出しによるクエリオブジェクトの受信が含まれます。
クエリへの応答には、返されたすべてのアイテムを提供する 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());
}
次の大きな例を確認することもできます。
注-次のプログラムは、以前に作成されたデータソースを想定している場合があります。 実行を試みる前に、サポートライブラリを取得し、必要なデータソース(必要な特性を備えたテーブル、または他の参照ソース)を作成します。
この例では、Eclipse IDE、AWS認証情報ファイル、およびEclipse AWS Javaプロジェクト内のAWS Toolkitも使用します。
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());
}
}
}