Có thể ĐẶT HÀNG kết quả bằng Truy vấn hoặc Quét API trong DynamoDB không?
Tôi cần biết liệu DynamoDB có thứ gì đó giống như [ORDER BY 'field'] từ các truy vấn SQL không?
Cảm ơn.
Có thể ĐẶT HÀNG kết quả bằng Truy vấn hoặc Quét API trong DynamoDB không?
Tôi cần biết liệu DynamoDB có thứ gì đó giống như [ORDER BY 'field'] từ các truy vấn SQL không?
Cảm ơn.
Câu trả lời:
Tuy nhiên, không rõ ràng, thứ tự rõ ràng là cần thiết cho nhiều trường hợp sử dụng trong thế giới thực và có thể được mô hình hóa bằng Khóa chính loại băm và loại phạm vi cho phù hợp:
Trong trường hợp này, khóa chính được tạo bởi hai thuộc tính. Thuộc tính đầu tiên là thuộc tính băm và thuộc tính thứ hai là thuộc tính phạm vi. Amazon DynamoDB xây dựng chỉ mục băm không theo thứ tự trên thuộc tính khóa chính băm và chỉ mục phạm vi được sắp xếp trên thuộc tính khóa chính phạm vi . [nhấn mạnh của tôi]
Sau đó, bạn có thể sử dụng chỉ mục phạm vi này để tùy chọn yêu cầu các mục thông qua tham số RangeKeyCondition của API truy vấn và chỉ định chuyển tiếp tới hoặc lùi của chỉ mục (tức là hướng sắp xếp) thông qua tham số ScanIndexForward .
Cập nhật: Bạn có thể sắp xếp theo một thuộc tính có chỉ mục phụ cục bộ theo cách tương tự.
Bạn có thể sử dụng phím sắp xếp và áp dụng tham số ScanIndexForward trong một truy vấn để sắp xếp theo thứ tự tăng dần hoặc giảm dần. Ở đây tôi giới hạn các mục trả lại là 1.
var params = {
TableName: 'Events',
KeyConditionExpression: 'Organizer = :organizer',
Limit: 1,
ScanIndexForward: false, // true = ascending, false = descending
ExpressionAttributeValues: {
':organizer': organizer
}
};
docClient.query(params, function(err, data) {
if (err) {
console.log(JSON.stringify(err, null, 2));
} else {
console.log(JSON.stringify(data, null, 2));
}
});
Sử dụng ScanIndexForward (đúng cho tăng dần và sai cho giảm dần) và cũng có thể giới hạn kết quả bằng cách sử dụng giá trị setLimit của Biểu thức truy vấn.
Vui lòng tìm mã bên dưới nơi đã sử dụng QueryPage để tìm một bản ghi.
public void fetchLatestEvents() {
EventLogEntitySave entity = new EventLogEntitySave();
entity.setId("1C6RR7JM0JS100037_contentManagementActionComplete");
DynamoDBQueryExpression<EventLogEntitySave> queryExpression = new DynamoDBQueryExpression<EventLogEntitySave>().withHashKeyValues(entity);
queryExpression.setScanIndexForward(false);
queryExpression.withLimit(1);
queryExpression.setLimit(1);
List<EventLogEntitySave> result = dynamoDBMapper.queryPage(EventLogEntitySave.class, queryExpression).getResults();
System.out.println("size of records = "+result.size() );
}
@DynamoDBTable(tableName = "PROD_EA_Test")
public class EventLogEntitySave {
@DynamoDBHashKey
private String id;
private String reconciliationProcessId;
private String vin;
private String source;
}
public class DynamoDBConfig {
@Bean
public AmazonDynamoDB amazonDynamoDB() {
String accesskey = "";
String secretkey = "";
//
// creating dynamo client
BasicAWSCredentials credentials = new BasicAWSCredentials(accesskey, secretkey);
AmazonDynamoDB dynamo = new AmazonDynamoDBClient(credentials);
dynamo.setRegion(Region.getRegion(Regions.US_WEST_2));
return dynamo;
}
@Bean
public DynamoDBMapper dynamoDBMapper() {
return new DynamoDBMapper(amazonDynamoDB());
}
}
Một tùy chọn khác sẽ giải quyết vấn đề là
Điều này sẽ cho phép sắp xếp bất kỳ giá trị nào trong bảng của bạn theo yêu cầu. Đó là một cách rất hiệu quả để tìm các mục xếp hạng cao nhất trong bảng của bạn mà không cần phải lấy toàn bộ truy vấn và lọc nó sau đó.
Nếu bạn đang sử dụng boto2 và bạn có khóa sắp xếp trên một trong các cột trong bảng của mình, bạn có thể sắp xếp những gì bạn truy xuất theo thứ tự hoặc theo thứ tự ngược lại bằng cách nói:
result = users.query_2(
account_type__eq='standard_user',
reverse=True)
Nếu bạn đang sử dụng boto3 và bạn có khóa sắp xếp trên cột mà bạn muốn sắp xếp kết quả, bạn có thể sắp xếp dữ liệu bạn truy xuất bằng cách nói:
result = users.query(
KeyConditionExpression=Key('account_type').eq('standard_user'),
ScanIndexForward=True)
Hãy nhớ trong boto3 nếu ScanIndexForward là true, DynamoDB trả về kết quả theo thứ tự chúng được lưu trữ (theo giá trị khóa sắp xếp). Đây là hành vi mặc định. Nếu ScanIndexForward là false, DynamoDB sẽ đọc kết quả theo thứ tự ngược lại bằng cách sắp xếp giá trị khóa, sau đó trả về kết quả cho máy khách.
Nếu bảng đã tồn tại thì hãy thêm GSI (Chỉ mục phụ toàn cầu) vào thuộc tính bạn muốn cho bảng và sử dụng Truy vấn chứ không phải Quét. Nếu bạn sắp tạo bảng thì bạn có thể thêm LSI (Local Secondary Index) vào thuộc tính bạn muốn.