AppSync 分页问题,​​没有返回任何项目,但有 nextToken

Jam*_*111 3 amazon-dynamodb aws-amplify dynamodb-queries

下面我描述了这个问题并给出了背景。这里有人以前遇到过这个问题吗?你是怎么解决的?或者我只是做错了什么?

描述错误

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

语境:

  • 我有一个屏幕选项卡视图,第一个选项卡显示待处理的待办事项项目,第二个选项卡显示已完成的待办事项项目。
  • 我有 3 个结果与我的 COMPLETED 过滤器相匹配
  • 我有大约 36 个与我的 PENDING 过滤器匹配的结果

代码片段/说明

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

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

这是列出已完成的待办事项的查询,正如您所看到的,限制为 10 和一个可选的 nextToken。这不能正常工作,当我第一次查询待办事项时,它返回一个空的项目数组 + 一个非空的 nextToken ...然后我必须使用给定的 nextToken 运行另一个查询来检索 3 个已完成的待办事项...这一定是一个错误?

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

预期行为

当运行我的 listTodos 查询来获取已完成的待办事项时,它应该在第一个查询中返回 3 个待办事项,我不需要使用返回的 nextToken 运行后续查询来检索仅 3 个已完成的待办事项。

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

额外的背景信息

  • 你们还需要任何其他上下文来帮助调试吗?让我知道。

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

Set*_*gan 10

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

来自文档

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

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

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

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

我不熟悉 AppSync,但听起来这就是您遇到的行为。