我需要在 maxcount 为 10 的 jsp 上显示搜索结果,并且它应该有一个分页来作为分页功能来回遍历。
Dynamodb 有一个 lastevaluatedkey ,但返回上一页并没有帮助,尽管我可以移动到 lastevaluatedKey 的下一个结果集。
有人可以帮忙吗?
我使用 Java SPRING 和 DynamoDB 作为堆栈。
谢谢萨蒂亚
我需要在 maxcount 为 10 的 jsp 上显示搜索结果,并且它应该有一个分页来作为分页功能来回遍历。
Dynamodb 有一个 lastevaluatedkey ,但返回上一页并没有帮助,尽管我可以移动到 lastevaluatedKey 的下一个结果集。
有人可以帮忙吗?
我使用 Java SPRING 和 DynamoDB 作为堆栈。
谢谢萨蒂亚
要启用前进/后退,您只需保持
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。
基于雷的回答,这就是我所做的。 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;
}
您必须在会话 var、查询字符串或稍后可以访问的类似内容中记录前一个键,然后在您想要后退时使用该键执行查询。Dynamo 不会为您跟踪。
要使用 dynamodb 进行简单的无状态正向和反向导航,请查看我对类似问题的回答:https ://stackoverflow.com/a/64179187/93451 。
总之,它在每个响应中返回反向导航历史记录,允许用户明确地向前或向后移动直到任一端。
GET /accounts -> first page
GET /accounts?next=A3r0ijKJ8 -> next page
GET /accounts?prev=R4tY69kUI -> previous page