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.
Wenn 'limit' ist Bei Verwendung von 'query' auf 2 setzen, gibt es immer noch alle Datensätze zurück. Warum ist es so? – user7
@ 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
Also gilt 'withLimit' nicht dafür? – user7