6

我需要在 maxcount 为 10 的 jsp 上显示搜索结果,并且它应该有一个分页来作为分页功能来回遍历。

Dynamodb 有一个 lastevaluatedkey 但返回上一页并没有帮助,尽管我可以移动到 lastevaluatedKey 的下一个结果

有人可以帮忙吗?

我使用 Java SPRING 和 DynamoDB 作为堆栈。

谢谢萨蒂亚

4

4 回答 4

5

要启用前进/后退,您只需保持

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。

于 2018-04-09T18:39:09.173 回答
4

基于雷的回答,这就是我所做的。 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;
}
于 2019-03-12T18:01:43.417 回答
3

您必须在会话 var、查询字符串或稍后可以访问的类似内容中记录前一个键,然后在您想要后退时使用该键执行查询。Dynamo 不会为您跟踪。

于 2013-01-18T21:38:46.737 回答
0

要使用 dynamodb 进行简单的无状态正向和反向导航,请查看我对类似问题的回答:https ://stackoverflow.com/a/64179187/93451 。

总之,它在每个响应中返回反向导航历史记录,允许用户明确地向前或向后移动直到任一端。

GET /accounts                -> first page
GET /accounts?next=A3r0ijKJ8 -> next page
GET /accounts?prev=R4tY69kUI -> previous page
于 2020-10-02T23:17:20.587 回答