【问题标题】:AppSync pagination issue where no items are returned but a nextToken isAppSync 分页问题,​​其中没有返回任何项目但 nextToken 是
【发布时间】:2021-02-01 23:09:23
【问题描述】:

下面我已经描述了这个问题并给出了上下文。这里有人遇到过这个问题吗?你是怎么解决的?还是我只是做错了什么?

描述错误

在 AppSync 模型列表上使用基于游标的分页时,它将返回一个空的 items 数组和一个 NON NULLnextToken,这表示有更多结果,当我查询下一个结果集时,它返回3 个匹配我的查询和过滤器的结果。我使用的限制为 10,并且只有 3 个结果,我很困惑为什么 AppSync 在我的第一个查询中没有返回这 3 个结果? (它应该返回 3 个结果 & nextToken 应该是 NULL)

上下文:

  • 我有一个用于屏幕的 tabview,第一个选项卡显示 PENDING TODO 项,第二个选项卡显示 COMPLETED TODO 项。
  • 我有 3 个结果与我的 COMPLETED 过滤器匹配
  • 我有大约 36 个结果与我的 PENDING 过滤器匹配

代码片段/说明

这是列出待办事项的查询,您可以看到限制为 10 和一个可选的 nextToken。这项工作按预期工作,我能够正确地对结果进行分页。

query listTodos($nextToken: String) {
  listTodos(limit: 10, nextToken: $nextToken, filter: {
    status: {
      eq: PENDING
    }
  }) {
    nextToken,
    items {
      id
      title
      status
    }
  }
}

这是列出 COMPLETED todos 的查询,你可以看到限制为 10 和一个可选的 nextToken。这不能正常工作,当我第一次查询 todos 时,它返回一个空的 items 数组 + a NON NULL nextToken...然后我必须使用给定的 nextToken 运行另一个查询来检索 3 COMPLETED todos...这一定是一个错误?

query listTodos($nextToken: String) {
  listTodos(limit: 10, nextToken: $nextToken, filter: {
    status: {
      eq: COMPLETED
    }
  }) {
    nextToken,
    items {
      id
      title
      status
    }
  }
}

预期行为

当我的 listTodos 查询 COMPLETED todos 时,它应该在第一个查询中返回 3 个 todos,我不应该需要使用返回的 nextToken 运行后续查询来检索 ONLY 3 COMPLETED todos。

当使用过滤器进行分页时,它应该只返回与过滤器匹配的 3 个结果并返回 null nextToken。

附加上下文

  • 你们还有其他需要帮助调试的上下文吗?告诉我。

我在 Amplify GitHub 上创建了一个问题:https://github.com/aws-amplify/amplify-js/issues/6997

【问题讨论】:

    标签: amazon-dynamodb aws-amplify dynamodb-queries


    【解决方案1】:

    在提供限制和过滤表达式时,使用 DynamoDB 进行分页可以提供令人惊讶的结果。它与何时将过滤器和限制应用于您的操作有关。

    来自the docs

    ...假设您查询一个表,其限制值为 6,并且没有 过滤器表达式。查询结果包含前六项 从与键条件表达式匹配的表中 请求。

    现在假设您向查询添加了一个过滤器表达式。在这个 在这种情况下,DynamoDB 最多读取六个项目,然后只返回那些 匹配过滤器表达式。最终查询结果包含六项 或更少,即使更多项目与过滤器表达式匹配 如果 DynamoDB 一直在读取更多项目。

    听起来您的第一个查询操作会抓取前 10 个项目,然后应用过滤条件,找到 no 匹配结果。因此,它不返回任何结果并提供一个令牌来恢复搜索操作。

    对于 Query 或 Scan 操作,如果操作未返回表中的所有匹配项,则 DynamoDB 可能会返回 LastEvaluatedKey 值。要获取与您的查询匹配的所有项目,请从上一个请求中获取 LastEvaluatedKey 值,并将其用作下一个请求中的 ExclusiveStartKey 值。重复此操作,直到 DynamoDB 不再返回 LastEvaluatedKey 值。

    我不熟悉 AppSync,但听起来这就是您正在经历的行为。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2023-02-16
      • 2019-11-27
      • 1970-01-01
      • 2020-05-15
      • 2019-10-22
      • 2017-09-03
      • 1970-01-01
      • 2016-08-19
      相关资源
      最近更新 更多