Dynamodb 简明教程

DynamoDB - Querying

查询会通过主键查找项目或辅助索引。执行查询要求使用分区键和特定值,或排序键和值;可以选择通过比较进行筛选。查询的默认执行过程是针对与提供的主键关联的项目返回每个属性。但你可以使用 ProjectionExpression 参数指定所需的属性。

查询使用 KeyConditionExpression 参数来选择项目,这要求以相等条件的形式提供分区键名称和值。你还可以选择为任何存在的排序键提供其他条件。

下面列出了排序键条件的几个示例 −

Sr.No

Condition & Description

1

x = y 如果属性 x 等于 y,它会求值为真。

2

x < y 如果 x 小于 y,它会求值为真。

3

x ⇐ y 如果 x 小于或等于 y,它会求值为真。

4

x > y 如果 x 大于 y,它会求值为真。

5

x >= y 如果 x 大于或等于 y,它会求值为真。

6

x BETWEEN y AND z 如果 x 同时 >= y 且 ⇐ z,则求值为真。

DynamoDB 还支持以下函数: begins_with (x, substr)

如果属性 x 以指定字符串开头,则求值为真。

以下条件必须符合某些要求 −

  1. 属性名必须以 a-z 或 A-Z 集合中的字符开头。

  2. 属性名的第二个字符必须属于 a-z、A-Z 或 0-9 集合。

  3. 属性名不能使用保留字。

不符合以上约束的属性名可以定义占位符。

查询通过按排序键顺序执行检索,并使用任何条件和筛选器表达式来处理。查询总是返回一个结果集,如果没有匹配项,则返回一个空集。

结果始终按排序键顺序返回,并且基于数据类型顺序,修改后的默认值为升序。

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

您还可以查看以下更大的示例。

Note − 以下程序可能会假设有一个已创建的数据源。在尝试执行之前,获得支持库并创建必要的数据源(具备所需特征的表格或其他引用的源)。

此示例还使用了 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());
      }
   }
}