2012-02-15 17 views

Odpowiedz

26

nie są wyraźnie jednak kolejność jest oczywiście potrzebne dla wielu przypadków użycia świata rzeczywistego i może być modelowane za pomocą Odpowiednio Hash and Range Type Primary Key:

W tym przypadku klucz podstawowy składa się z dwóch atrybutów. Pierwsze atrybuty są atrybutami mieszającymi, a drugim atrybutem jest zakres . Amazon DynamoDB tworzy nieuporządkowany indeks mieszania dla atrybutu klucza podstawowego hash i indeksu zakresu sortowanego w zakresie podstawowego atrybutu klucza . [podkr]

Następnie można użyć tego indeksu zakres opcjonalnie elementy żądania przez parametru RangeKeyCondition na Query API i określić przód lub w tył przechodzenie indeksu (czyli kierunek sortowania) poprzez Parametr ScanIndexForward .

Aktualizacja: Możesz zamówić według atrybutu z local secondary index w ten sam sposób.

+13

ScanIndexForward param wydaje się mieć zastosowanie wyłącznie do [] (http://docs.amazonwebservices.com/amazondynamodb/latest/developerguide/API_Query.html Query), nie [Scan] (http: // docs.amazonwebservices.com/amazondynamodb/latest/developerguide/API_Scan.html) czy to prawda? Jak można zwrócić uporządkowaną listę stronicowanych wszystkich elementów w tabeli za pomocą Query? Skanowanie wydaje się być sposobem na zwrócenie "*", ale wydaje się, że nie ma paramu do porządkowania wyników. – case2000

+0

Nie korzystałem z tej funkcji, czytam tylko o tym, ale Query obsługuje określenie [Limit] (http://docs.aws.amazon.com/amazondynamodb/latest/developerguide/QueryAndScan.html#ScanQueryLimit), aby ograniczyć liczba otrzymanych wyników i jeśli po osiągnięciu limitu pojawi się więcej elementów pasujących do zapytania, otrzymasz wartość _LastEvaluatedKey_, która może być użyta do wykonania innego zapytania i zachowania wyników wyszukiwania. – fernio

6

Można użyć sortowania klucz i zastosować parametr ScanIndexForward w query do sortowania w porządku rosnącym lub malejącym. Tutaj ograniczę rzeczy wracać do 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

Problem polega na tym, że chcesz zwrócić * wszystkie * przedmioty. Zasadniczo oznacza to, że musisz utworzyć nową kolumnę fikcyjną, przypisać tę samą wartość do wszystkich wierszy, utworzyć GSI w tej kolumnie i zapytanie wywołania zamiast skanowania. – JHH

0

Jeśli używasz boto2 i masz klucz sortowania na jednej z kolumn w tabeli można sortować czego pobierać w kolejności lub w odwrotnej kolejności przez mówiąc:

result = users.query_2(
    account_type__eq='standard_user', 
    reverse=True) 

Jeśli używasz boto3 i masz klucz sortowania na kolumny, które chcesz posortować wynik przez można sortować dane pobieraniu mówiąc:

result = users.query(
    KeyConditionExpression=Key('account_type').eq('standard_user'), 
    ScanIndexForward=True) 

Zapamiętaj w boto3, jeśli ScanIndexForward jest prawdziwe, DynamoDB zwraca wyniki w kolejności, w jakiej są przechowywane (według wartości klucza sortowania). To jest domyślne zachowanie. Jeśli wartość ScanIndexForward jest nieprawidłowa, DynamoDB odczytuje wyniki w kolejności odwrotnej, sortując wartość klucza, a następnie zwraca wyniki do klienta.

2

Zastosowanie ScanIndexForward (true dla rosnącej i malejącej false), a także może ograniczyć wynik używając wartości setLimit wypowiedzi Query.

Poniżej znajduje się kod, w którym używana jest strona QueryPage do wyszukiwania pojedynczego rekordu.

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

Użyj ScanIndexForward (prawda dla rosnącej i fałszywa dla malejącej) –

Powiązane problemy