我需要在jsp上显示maxcount为10的搜索结果,并且它应该具有向后和向前遍历的分页功能。
Dynamodb有一个lastevaluatedkey,但它没有帮助回到上一页,虽然我可以移动到下一个结果集的lastevaluatedkey。
有谁能帮帮忙吗?我使用Java SPRING和DynamoDB作为堆栈。
谢谢萨提亚
要启用forward/backward,您只需要保持
the first key
,它是前一个返回页的第一个记录的hash key + sort key
(如果要查询第一个页,则为null)。
和
检索页的 the last key
,即先前返回页的最后一条记录的hash key + sort key
然后要向前或向后导航,您需要在查询请求中传入以下参数:
Forward: last key as the ExclusiveStartKey, order = ascend
Backward: first key as the ExclusiveStartKey, order = descend
我在2016年的一个项目中做到了这一点。DynamoDB现在可能提供了一些类似的方便api,但我不确定,因为我很久没有检查过DynamoDB了。
以Ray的回答为基础,以下是我所做的。sortId
是排序键。
// query a page of items and create prev and next cursor
// cursor idea from this article: https://hackernoon.com/guys-were-doing-pagination-wrong-f6c18a91b232
async function queryCursor( cursor) {
const cursor1 = JSON.parse(JSON.stringify(cursor));
const pageResult = await queryPage( cursor1.params, cursor1.pageItems);
const result = {
Items: pageResult.Items,
Count: pageResult.Count
};
if ( cursor.params.ScanIndexForward) {
if (pageResult.LastEvaluatedKey) {
result.nextCursor = JSON.parse(JSON.stringify(cursor));
result.nextCursor.params.ExclusiveStartKey = pageResult.LastEvaluatedKey;
}
if ( cursor.params.ExclusiveStartKey) {
result.prevCursor = JSON.parse(JSON.stringify(cursor));
result.prevCursor.params.ScanIndexForward = !cursor.params.ScanIndexForward;
result.prevCursor.params.ExclusiveStartKey.sortId = pageResult.Items[0].sortId;
}
} else {
if (pageResult.LastEvaluatedKey) {
result.prevCursor = JSON.parse(JSON.stringify(cursor));
result.prevCursor.params.ExclusiveStartKey = pageResult.LastEvaluatedKey;
}
if ( cursor.params.ExclusiveStartKey) {
result.nextCursor = JSON.parse(JSON.stringify(cursor));
result.nextCursor.params.ScanIndexForward = !cursor.params.ScanIndexForward;
result.nextCursor.params.ExclusiveStartKey.sortId = pageResult.Items[0].sortId;
}
}
return result;
}
您必须在会话变量、查询字符串或以后可以访问的类似内容中保留前一个键的记录,然后在您想要返回时使用该键执行查询。Dynamo不会为你记录这些。
对于使用dynamodb的简单无状态正向和反向导航,请查看我对类似问题的回答:https://stackoverflow.com/a/64179187/93451.
总之,它在每个响应中返回反向导航历史,允许用户显式地向前或向后移动,直到任何一端。
GET /accounts -> first page
GET /accounts?next=A3r0ijKJ8 -> next page
GET /accounts?prev=R4tY69kUI -> previous page