DynamoDB - Truy vấn
Truy vấn xác định vị trí các mục hoặc chỉ mục phụ thông qua các khóa chính. Thực hiện truy vấn yêu cầu khóa phân vùng và giá trị cụ thể hoặc khóa sắp xếp và giá trị; với tùy chọn để lọc với các so sánh. Hành vi mặc định của truy vấn bao gồm trả về mọi thuộc tính cho các mục được liên kết với khóa chính được cung cấp. Tuy nhiên, bạn có thể chỉ định các thuộc tính mong muốn vớiProjectionExpression tham số.
Một truy vấn sử dụng KeyConditionExpressionđể chọn các mục, yêu cầu cung cấp tên và giá trị khóa phân vùng ở dạng điều kiện bình đẳng. Bạn cũng có tùy chọn cung cấp một điều kiện bổ sung cho bất kỳ khóa sắp xếp nào hiện có.
Một vài ví dụ về các điều kiện chính sắp xếp là:
Sr.No | Tình trạng & Mô tả |
---|---|
1 | x = y Nó đánh giá là true nếu thuộc tính x bằng y. |
2 | x < y Nó đánh giá là true nếu x nhỏ hơn y. |
3 | x <= y Nó đánh giá là true nếu x nhỏ hơn hoặc bằng y. |
4 | x > y Nó đánh giá là true nếu x lớn hơn y. |
5 | x >= y Nó đánh giá là true nếu x lớn hơn hoặc bằng y. |
6 | x BETWEEN y AND z Nó đánh giá là true nếu x là cả> = y và <= z. |
DynamoDB cũng hỗ trợ các chức năng sau: begins_with (x, substr)
Nó đánh giá là true nếu thuộc tính x bắt đầu bằng chuỗi được chỉ định.
Các điều kiện sau đây phải phù hợp với các yêu cầu nhất định:
Tên thuộc tính phải bắt đầu bằng một ký tự trong bộ az hoặc AZ.
Ký tự thứ hai của tên thuộc tính phải thuộc bộ az, AZ hoặc 0-9.
Tên thuộc tính không được sử dụng các từ dành riêng.
Tên thuộc tính không tuân thủ các ràng buộc ở trên có thể xác định trình giữ chỗ.
Truy vấn xử lý bằng cách thực hiện truy xuất theo thứ tự khóa sắp xếp và sử dụng bất kỳ biểu thức điều kiện và bộ lọc nào hiện có. Các truy vấn luôn trả về một tập hợp kết quả và nếu không có kết quả nào phù hợp, nó sẽ trả về một tập hợp trống.
Kết quả luôn trả về theo thứ tự khóa sắp xếp và thứ tự dựa trên kiểu dữ liệu với mặc định có thể sửa đổi là thứ tự tăng dần.
Truy vấn với Java
Các truy vấn trong Java cho phép bạn truy vấn các bảng và chỉ mục phụ. Chúng yêu cầu đặc tả các khóa phân vùng và các điều kiện bình đẳng, với tùy chọn để chỉ định các khóa và điều kiện sắp xếp.
Các bước bắt buộc chung cho một truy vấn trong Java bao gồm tạo một cá thể lớp DynamoDB, cá thể lớp Bảng cho bảng đích và gọi phương thức truy vấn của cá thể Bảng để nhận đối tượng truy vấn.
Phản hồi cho truy vấn chứa một ItemCollection đối tượng cung cấp tất cả các mặt hàng trả lại.
Ví dụ sau minh họa truy vấn chi tiết:
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());
}
Phương thức truy vấn hỗ trợ nhiều tham số tùy chọn. Ví dụ sau minh họa cách sử dụng các tham số này:
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());
}
Bạn cũng có thể xem lại ví dụ lớn hơn sau đây.
Note- Chương trình sau có thể giả sử một nguồn dữ liệu đã tạo trước đó. Trước khi cố gắng thực thi, hãy thu thập các thư viện hỗ trợ và tạo các nguồn dữ liệu cần thiết (các bảng có các đặc điểm bắt buộc hoặc các nguồn tham chiếu khác).
Ví dụ này cũng sử dụng Eclipse IDE, tệp thông tin đăng nhập AWS và Bộ công cụ AWS trong Dự án Java AWS của Eclipse.
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());
}
}
}