2012-02-15 22 views

Trả lời

26

Không rõ ràng, tuy nhiên, trật tự rõ ràng cần thiết đối với nhiều trường hợp sử dụng thế giới thực và có thể được mô hình hóa bằng phương tiện của Hash and Range Type Primary Key phù hợp:

Trong trường hợp này, các khóa chính được làm bằng 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 một chỉ mục băm không theo thứ tự trên thuộc tính khóa chính băm và một chỉ số phạm vi được phân loại trên phạm vi chính thuộc tính khóa. [tôi nhấn mạnh]

Sau đó bạn có thể sử dụng chỉ số phạm vi này để tùy mặt hàng theo yêu cầu thông qua RangeKeyCondition tham số của Query API và chỉ định về phía trước hoặc traversal lạc hậu của chỉ số (tức là theo hướng loại) thông qua tham số ScanIndexForward.

Cập nhật: Bạn có thể đặt hàng theo thuộc tính với số local secondary index theo cách tương tự.

+13

Các ScanIndexForward param dường như chỉ áp dụng cho [Query] (http://docs.amazonwebservices.com/amazondynamodb/latest/developerguide/API_Query.html), không phải là [Scan] (http: // docs.amazonwebservices.com/amazondynamodb/latest/developerguide/API_Scan.html) có đúng không? Làm cách nào để trả lại danh sách được sắp xếp theo thứ tự của tất cả các mục trong bảng bằng Truy vấn? Quét dường như là cách để trả về "*", nhưng nó dường như không có một tham số cho các kết quả sắp xếp. – case2000

+0

Tôi đã không sử dụng tính năng này, chỉ đọc về nó, nhưng truy vấn hỗ trợ chỉ định [Giới hạn] (http://docs.aws.amazon.com/amazondynamodb/latest/developerguide/QueryAndScan.html#ScanQueryLimit), để giới hạn số lượng kết quả nhận được và nếu có nhiều mục phù hợp với truy vấn của bạn khi đạt đến giới hạn, bạn sẽ nhận được _LastEvaluatedKey_ có thể được sử dụng để thực hiện truy vấn khác và tiếp tục truy xuất kết quả. – fernio

6

Bạn có thể sử dụng phím sắp xếp và áp dụng tham số ScanIndexForward trong một query để sắp xếp theo thứ tự tăng dần hoặc giảm dần. Ở đây tôi hạn chế các mặt hàng trở lại 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)); 
    } 
}); 
+2

Vấn đề là nếu bạn muốn trả lại * tất cả * mục. Về cơ bản, điều đó có nghĩa là bạn phải tạo một cột giả mới, gán cùng một giá trị trong nó cho tất cả các hàng, tạo một GSI trên cột đó và truy vấn cuộc gọi thay vì quét. – JHH

0

Nếu bạn đang sử dụng boto2 và bạn có chìa khóa sắp xếp trên một trong các cột trong bảng, bạn có thể sắp xếp những gì bạn lấy theo thứ tự hoặc theo thứ tự ngược bởi 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ó chìa khóa sắp xếp trên cột mà bạn muốn sắp xếp kết quả bằng cách, bạn có thể sắp xếp dữ liệu bạn lấy 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à đúng, DynamoDB trả về kết quả theo thứ tự chúng được lưu trữ (bằng cách sắp xếp giá trị khóa). Đây là hành vi mặc định. Nếu ScanIndexForward là false, DynamoDB đọc kết quả theo thứ tự ngược lại bằng cách sắp xếp giá trị khóa, và sau đó trả về kết quả cho máy khách.

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 bên dưới mã nơi QueryPage được sử dụng để tìm kiế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()); 
    } 
} 
+0

Sử dụng ScanIndexForward (đúng cho tăng dần và sai cho giảm dần) –

Các vấn đề liên quan