📅  最后修改于: 2020-11-28 14:00:41             🧑  作者: Mango
查询通过主键查找项目或二级索引。执行查询需要分区键和特定值,或者排序键和值;并选择进行比较过滤。查询的默认行为包括返回与提供的主键关联的项的每个属性。但是,您可以使用ProjectionExpression参数指定所需的属性。
查询利用KeyConditionExpression参数选择项,这要求以相等条件的形式提供分区键名称和值。您还可以选择为存在的任何排序键提供附加条件。
排序关键条件的一些示例是-
Sr.No | Condition & Description |
---|---|
1 |
x = y It evaluates to true if the attribute x equals y. |
2 |
x < y It evaluates to true if x is less than y. |
3 |
x <= y It evaluates to true if x is less than or equal to y. |
4 |
x > y It evaluates to true if x is greater than y. |
5 |
x >= y It evaluates to true if x is greater than or equal to y. |
6 |
x BETWEEN y AND z It evaluates to true if x is both >= y, and <= z. |
DynamoDB还支持以下功能: Begins_with(x,substr)
如果属性x以指定的字符串开头,则计算结果为true。
以下条件必须符合某些要求-
属性名称必须以az或AZ集合内的字符开头。
属性名称的第二个字符必须属于az,AZ或0-9集。
属性名称不能使用保留字。
不符合上述约束的属性名称可以定义一个占位符。
查询通过按排序键顺序执行检索,并使用存在的任何条件和过滤器表达式进行处理。查询总是返回一个结果集,如果没有匹配项,它将返回一个空的结果集。
结果始终以排序键顺序和基于数据类型的顺序返回,可修改的默认顺序为升序。
Java中的查询使您可以查询表和二级索引。它们要求指定分区键和相等条件,并可以选择指定排序键和条件。
Java查询所需的一般步骤包括创建DynamoDB类实例,目标表的Table类实例,以及调用Table实例的查询方法以接收查询对象。
对查询的响应包含提供所有返回项目的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 items = table.query(spec);
Iterator- 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 items = table.query(spec);
Iterator- iterator = items.iterator();
while (iterator.hasNext()) {
System.out.println(iterator.next().toJSONPretty());
}
您也可以查看以下较大的示例。
注–以下程序可能假定以前创建的数据源。在尝试执行之前,请获取支持库并创建必要的数据源(具有所需特征的表或其他引用的源)。
此示例还使用Eclipse IDE,AWS凭证文件和Eclipse AWS Java Project中的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 items = table.query(spec);
System.out.println("\ngetThreadReplies results:");
Iterator- iterator = items.iterator();
while (iterator.hasNext()) {
System.out.println(iterator.next().toJSONPretty());
}
}
}