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