DynamoDB中的分页



我需要在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

相关内容

  • 没有找到相关文章

最新更新