DynamoDB - 查詢



查詢透過主鍵定位專案或二級索引。執行查詢需要分割槽鍵和特定值,或排序鍵和值;可以選擇使用比較進行過濾。查詢的預設行為包括返回與提供的每個主鍵關聯的專案的每個屬性。但是,您可以使用ProjectionExpression引數指定所需的屬性。

查詢利用KeyConditionExpression引數選擇專案,這需要以等式條件的形式提供分割槽鍵名稱和值。您還可以選擇為任何存在的排序鍵提供其他條件。

排序鍵條件的一些示例如下:

序號 條件和描述
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 以指定的字串開頭,則計算結果為真。

以下條件必須符合某些要求:

  • 屬性名稱必須以 a-z 或 A-Z 集合中的字元開頭。

  • 屬性名稱的第二個字元必須位於 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());
}

query 方法支援各種可選引數。以下示例演示瞭如何使用這些引數:

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 工具包。

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

© . All rights reserved.