amazon-web-services - 为什么 LSI 在最后一条记录上返回 LastEvalutedKey?

标签 amazon-web-services amazon-dynamodb dynamodb-queries

我正在尝试使用LSI在dynamodb中实现分页(向前和向后)。

我已经在 abc 属性上创建了 LSI,该属性的字符串类型包含“https://mydomain/[A-Za-z1-9-_~]”形式的字符

当我尝试在到达最后一条记录时向前分页时,LastEvaluated 键变为 null,这是预期的行为,但是对于反向分页,我得到了 LastEvaluatedKey。甚至引用了文档https://docs.aws.amazon.com/amazondynamodb/latest/APIReference/API_Query.html#DDB-Query-response-LastEvaluatedKey

如果我想实现向后分页,如何使用查询操作找到最后一页是什么?

我的代码

params.ScanIndexForward = false;
  response = await dynamoDb.query(paramsForQuery).promise();
  console.log('LE', response.LastEvaluatedKey);
  const arrayLength = response.Items.length;
  LastEvalSortKey = {
    pk: userId,
    originalUrl: response.Items[0].originalUrl,
  };
  if (sortBy === 'createdAt')
    LastEvalSortKey[sortBy] = response.Items[0].createdAt;
  if (sortBy === 'updatedAt')
    LastEvalSortKey[sortBy] = response.Items[0].updatedAt;
  if (sortBy === 'convertedUrl')
    LastEvalSortKey[sortBy] = response.Items[0].convertedUrl;
  return {
    items: response.Items,
    nextToken: arrayLength
      ? Base64.encodeURI(JSON.stringify(LastEvalSortKey))
      : prevToken,
    prevToken: response.LastEvaluatedKey
      ? Base64.encodeURI(JSON.stringify(response.LastEvaluatedKey))
      : undefined,
  };

最佳答案

您链接到的文档有答案:

If LastEvaluatedKey is not empty, it does not necessarily mean that there is more data in the result set. The only way to know when you have reached the end of the result set is when LastEvaluatedKey is empty.

您知道已到达末尾的唯一方法是查询,直到获得空的 LastEvaluatedKey

如果您可以保证单个页面中的数据大小不会接近 1 MB 查询限制,则可以使用的一个技巧是查询(页面 + 1)个项目。

如果查询返回 page + 1 个项目,您可以丢弃最后一个项目并使用它来知道还有另一个页面。如果它返回的项目较少,并且您有 LastEvaluatedKey,您可以假设没有其他数据,或者执行额外的单个项目查询来检查您是否处于末尾。

关于amazon-web-services - 为什么 LSI 在最后一条记录上返回 LastEvalutedKey?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/69927816/

相关文章:

python-3.x - Boto3:使用 boto3.resource ('s3' )列出所有 S3 存储桶

java - 如何动态更改使用 DynamoDB 的 Java Mapper 访问的表?

go - 并行执行 DynamoDB 查询(全局二级索引的 BatchGetItems)

amazon-web-services - AWS RDS 数据库日志设置日志组的保留期限

apache - 奇怪的用户代理标志 "x-middleton"

python - AWS EC2 中的 Python 脚本如何与 ServiceNow REST API 通信

python - 如何使用 Insert/Modify/Remove 将 dynamodb 设计为 Elastic search

node.js - 如何使用 Jest 在 Nodejs 中模拟 Amazon DynamoDB v3?

amazon-web-services - go and dynamo 从表中的字段和字段不为空/字段不为空的表中获取数据

python - 根据表dynamodb python中的存在更新或插入项目