DynamoDB - การสืบค้น

แบบสอบถามค้นหารายการหรือดัชนีรองผ่านคีย์หลัก การดำเนินการค้นหาต้องใช้คีย์พาร์ติชันและค่าเฉพาะหรือคีย์การจัดเรียงและค่า พร้อมตัวเลือกในการกรองด้วยการเปรียบเทียบ ลักษณะการทำงานเริ่มต้นของแบบสอบถามประกอบด้วยการส่งคืนทุกแอตทริบิวต์สำหรับรายการที่เกี่ยวข้องกับคีย์หลักที่ให้มา อย่างไรก็ตามคุณสามารถระบุแอตทริบิวต์ที่ต้องการด้วยไฟล์ProjectionExpression พารามิเตอร์.

แบบสอบถามใช้ไฟล์ KeyConditionExpressionพารามิเตอร์เพื่อเลือกไอเท็มซึ่งต้องระบุชื่อคีย์พาร์ติชันและค่าในรูปแบบของเงื่อนไขความเท่าเทียมกัน คุณยังมีตัวเลือกในการระบุเงื่อนไขเพิ่มเติมสำหรับคีย์การเรียงลำดับที่มีอยู่

ตัวอย่างเงื่อนไขคีย์การจัดเรียงมีดังนี้ -

ซีเนียร์ No เงื่อนไขและคำอธิบาย
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)

จะประเมินเป็น true หากแอตทริบิวต์ x เริ่มต้นด้วยสตริงที่ระบุ

เงื่อนไขต่อไปนี้ต้องเป็นไปตามข้อกำหนดบางประการ -

  • ชื่อแอตทริบิวต์ต้องขึ้นต้นด้วยอักขระภายในชุด az หรือ AZ

  • อักขระตัวที่สองของชื่อแอตทริบิวต์ต้องอยู่ในชุด az, AZ หรือ 0-9

  • ชื่อแอตทริบิวต์ไม่สามารถใช้คำสงวน

ชื่อแอตทริบิวต์ที่ไม่เป็นไปตามข้อ จำกัด ข้างต้นสามารถกำหนดตัวยึดได้

เคียวรีประมวลผลโดยดำเนินการดึงข้อมูลตามลำดับคีย์การจัดเรียงและใช้เงื่อนไขและนิพจน์ตัวกรองที่มีอยู่ การสืบค้นจะส่งคืนชุดผลลัพธ์เสมอและเมื่อไม่มีการจับคู่จะส่งกลับค่าว่าง

ผลลัพธ์จะส่งคืนตามลำดับคีย์การจัดเรียงและลำดับตามชนิดข้อมูลโดยมีค่าเริ่มต้นที่ปรับเปลี่ยนได้เป็นลำดับจากน้อยไปมาก

การสืบค้นด้วย Java

คิวรีใน Java ช่วยให้คุณสามารถสอบถามตารางและดัชนีรองได้ พวกเขาต้องการข้อกำหนดของคีย์พาร์ติชันและเงื่อนไขความเท่าเทียมกันโดยมีตัวเลือกในการระบุคีย์การเรียงลำดับและเงื่อนไข

ขั้นตอนที่จำเป็นทั่วไปสำหรับแบบสอบถามใน Java ได้แก่ การสร้างอินสแตนซ์คลาส DynamoDB อินสแตนซ์คลาสของตารางสำหรับตารางเป้าหมายและการเรียกใช้วิธีการสอบถามของอินสแตนซ์ 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<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 และ AWS Toolkit ภายใน Eclipse AWS Java Project

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