10

Dynamo DB unterstützt die Paginierung von Scan- und Abfrageoperationen über die API-Dokumentation. Der Haken hier ist, die ExclusiveStartIndex der aktuellen Anfrage auf den Wert der LastEvaluatedIndex der vorherigen Anfrage zu setzen, um die nächste Menge (logische Seite) der Ergebnisse zu erhalten.Seitennummerierung mit DynamoDBMapper Java AWS SDK

Ich versuche, das gleiche zu implementieren, aber ich verwende DynamoDBMapper, die viel mehr Vorteile wie enge Kopplung mit Datenmodellen zu haben scheint. Also, wenn ich die oben tun wollte, ich gehe davon aus ich würde wie unten etwas tun:

// Mapping of hashkey of the last item in previous query operation 
Map<String, AttributeValue> lastHashKey = .. 
DynamoDBQueryExpression expression = new DynamoDBQueryExpression(); 

... 
expression.setExclusiveStartKey(); 
List<Table> nextPageResults = mapper.query(Table.class, expression); 

Ich hoffe, dass meine oben Verständnis Paginieren mit DynamoDBMapper korrekt ist. Zweitens, wie würde ich wissen, dass ich das Ende der Ergebnisse erreicht habe. wenn ich aus der Dokumentation verwenden Sie die folgende api:

QueryResult result = dynamoDBClient.query((QueryRequest) request); 
boolean isEndOfResults = StringUtils.isEmpty(result.getLastEvaluatedKey()); 

Kommen wir zurück DynamoDBMapper zu verwenden, wie kann ich wissen, ob ich Ende der Ergebnisse in diesem Fall erreicht haben.

Antwort

22

Sie haben ein paar verschiedene Optionen mit der DynamoDBMapper, je nachdem, wie Sie gehen möchten.

Der Teil hier ist das Verständnis der Unterschied zwischen der Methoden und welche Funktionalität ihre zurückgegebenen Objekte einkapseln.

Ich gehe über PaginatedScanList und ScanResultPage, aber diese Methoden/Objekte spiegeln sich im Grunde gegenseitig.

Die PaginatedScanList sagt der folgende, Hervorhebung von mir:

Umsetzung der Liste Schnittstelle, die die Ergebnisse einer Prüfung in AWS DynamoDB darstellt. Paginierte Ergebnisse werden bei Bedarf geladen, wenn der Benutzer eine Operation ausführt, die sie erfordert. Einige Operationen, z. B. size(), müssen die gesamte Liste abrufen, die Ergebnisse werden jedoch möglichst seitenweise abgerufen.

Dies besagt, dass die Ergebnisse beim Durchlaufen der Liste geladen werden. Wenn Sie die erste Seite durchgehen, wird die zweite Seite automatisch abgerufen, ohne dass Sie explizit eine weitere Anfrage stellen müssen. Lazy Laden der Ergebnisse ist die Standardmethode, aber es kann außer Kraft gesetzt werden, wenn Sie die überladenen Methoden aufrufen und eine DynamoDBMapperConfig mit einer anderen DynamoDBMapperConfig.PaginationLoadingStrategy liefern.

Dies unterscheidet sich von der ScanResultPage. Sie erhalten eine Seite mit Ergebnissen, und es ist an der Zeit, sich mit der Paginierung selbst zu befassen.Hier

ist schnell Codebeispiel ein Beispiel für die Verwendung beider Methoden zeigt, die ich mit einem Tisch von 5 Artikel lief DynamoDBLocal mit:

final DynamoDBMapper mapper = new DynamoDBMapper(client); 

// Using 'PaginatedScanList' 
final DynamoDBScanExpression paginatedScanListExpression = new DynamoDBScanExpression() 
     .withLimit(limit); 
final PaginatedScanList<MyClass> paginatedList = mapper.scan(MyClass.class, paginatedScanListExpression); 
paginatedList.forEach(System.out::println); 

System.out.println(); 
// using 'ScanResultPage' 
final DynamoDBScanExpression scanPageExpression = new DynamoDBScanExpression() 
     .withLimit(limit); 
do { 
    ScanResultPage<MyClass> scanPage = mapper.scanPage(MyClass.class, scanPageExpression); 
    scanPage.getResults().forEach(System.out::println); 
    System.out.println("LastEvaluatedKey=" + scanPage.getLastEvaluatedKey()); 
    scanPageExpression.setExclusiveStartKey(scanPage.getLastEvaluatedKey()); 

} while (scanPageExpression.getExclusiveStartKey() != null); 

Und die Ausgabe:

MyClass{hash=2} 
MyClass{hash=1} 
MyClass{hash=3} 
MyClass{hash=0} 
MyClass{hash=4} 

MyClass{hash=2} 
MyClass{hash=1} 
LastEvaluatedKey={hash={N: 1,}} 
MyClass{hash=3} 
MyClass{hash=0} 
LastEvaluatedKey={hash={N: 0,}} 
MyClass{hash=4} 
LastEvaluatedKey=null 
+0

Wenn 'limit' ist Bei Verwendung von 'query' auf 2 setzen, gibt es immer noch alle Datensätze zurück. Warum ist es so? – user7

+1

@ user7 Es scheint nur, dass es alle Datensätze zurückgibt, wenn tatsächlich die zugrunde liegende Implementierung ('PaginatedQueryList') die Paginierung für Sie bearbeitet. Sehen Sie in der Dokumentation zu ['PaginatedQueryList'] nach (https://docs.aws.amazon.com/AWSJavaSDK/latest/javadoc/com/amazonaws/services/dynamodbv2/datamodeling/PaginatedQueryList.html). Es verhält sich genauso, wie ich oben über "Scan" geschrieben habe. Wenn Sie darüber iterieren, werden schließlich alle Elemente abgerufen, da die Paginierungsaufrufe automatisch ausgeführt werden. – mkobit

+0

Also gilt 'withLimit' nicht dafür? – user7