[英]DynamoDB pagination - knowing when there is no more results
該文檔指出:
缺少 LastEvaluatedKey 是知道您已到達結果集末尾的唯一方法
但是,如果您有 10 個項目並且您正在查詢 10 個項目,您將獲得帶有 LastEvaluatedKey 的結果集。 但是之后沒有更多的項目。
是否有一種可靠的方法可以真正知道何時到達結果集的末尾?
當您指定限制(根據該問題為10)時,它會找到限制所提供的項目數,並且看起來不會超出限制。
由於項目為10,限制為10,因此每次都可以按限制查找元素。
第二次嘗試讀取項目時,它在表中找不到任何項目,因此返回null。 您將需要while循環,如下所示:
List<QueryResult> queryResultList = new ArrayList<>();
// Since query returns only max 1MB of items at a time,
// use of this flag tells if no more such elements are present in db.
Map<String, AttributeValue> lastKeyEvaluated = null;
Map<String, AttributeValue> expressionAttributeValue = new HashMap<>();
expressionAttributeValue.put(":primary_key_value", new AttributeValue().withS(primary_key_value));
do {
QueryRequest queryRequest = new QueryRequest()
.withTableName(this.getDynamoTable().getTableName())
.withIndexName(Constants.Table.INDEX_NAME)
.withKeyConditionExpression("primary_key = :primary_key_value")
.withExpressionAttributeValues(expressionAttributeValue)
.withExclusiveStartKey(lastKeyEvaluated);
QueryResult result = this.getAmazonDynamoDBClient().query(queryRequest);
queryResultList.add(result);
lastKeyEvaluated = result.getLastEvaluatedKey();
} while (lastKeyEvaluated != null);
我知道這個問題已有 4 年歷史,但我也遇到過這個問題,這就是我“解決”它的方式:
在我的例子中,我使用最后評估的鍵對結果進行分頁,並且我通過一個變量(我們稱之為 pageSize)給出查詢大小。
使用問題的示例,我們將給 function pageSize = 10。
當結果與 pageSize 完全相同時,我們如何緩解 lastEvaluatedKey 問題?
我們查詢 pageSize + 1 個項目,如果 response.length == pageSize + 1,這意味着我們至少有 1 + X 個額外的項目,這意味着頁面更多。 然后我們檢索 pageSize 項的 lastEvaluatedKey(記住我們檢索了 pageSize + 1 項)。 如果有 response.length < pageSize 則沒有 lastEvaluatedKey 要傳遞
摘要示例:我們想要一個包含 10 個項目的頁面。 然后我們查詢 11 項。 兩種可能性:
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.