首页 > 解决方案 > AWS AppSync 未从 DynamoDB 返回所有记录

问题描述

在使用 DynamoDB 作为数据源时,我展示了 135 行样本数据的总记录数。但是,当我运行listAll查询时,我在屏幕上看到非常随机的数据,限制为 20 条记录。

当我通过将limit参数设置为 150 进行调查时,我得到了所有数据。如果我将限制保持在两个或三个并尝试添加一个过滤器来查询结果,我没有得到任何.

当我继续检查请求映射模板时,我发现 limit 的默认值被传递为 20。因此,我们看到随机的 20 条记录。

"limit": $util.defaultIfNull($ctx.args.limit, 20)

因此,如果您的过滤器有这 20 条记录中的任何一条的记录详细信息,您就会得到结果。如果 DynamoDB 中还有其他内容,则不会返回。

如果您从 RequestMappingTemplate 中删除此限制属性,则会收到所有数据。但是,任何时候你超过了限制,它都不会被计算在内,你会得到所有的结果。

我从这个练习中看到的是限制与行索引之类的东西直接相关。

我这样说的原因:假设您正在使用过滤器运行查询,并且您没有得到任何结果,但是 anextToken是可用的。如果您再次使用 this 查询nextToken,限制为两个,如果您要查找的这些记录不属于查询检索的 20 条记录,您将不会再次获得任何结果。

换句话说,它似乎首先获取然后limit才应用过滤器。

我还在 DynamoDB 中检查了相同的内容,我在过滤时没有遇到任何此类问题。

谁能帮我这个?我在这里浏览过其他类似的帖子,但它们没有解决limit限制查询池的场景,而不是返回结果的数量。

标签: amazon-dynamodb

解决方案


当您查询或扫描 DynamoDB 表时,您可以限制返回的项目数。但是,任何过滤都是在限制之后完成的,这可以在找到您正在寻找的项目之前为您提供“无数据”页面,正如您所描述的那样。

请注意,尽管您可以取消限制,但 DynamoDB 仍将强制执行 1MB 的最大页面。物品的数量将取决于您的物品有多大。因此,除非您的表中始终有 <1MB 的数据,否则您将需要在前端实现分页,否则一旦页面大小(项目数)太大,您的查询将不会检查所有项目。

如果您希望过滤后每页的结果数量更加一致,您可能希望查询索引而不是过滤。您可以尝试添加 GSI,以便仅查询您正在寻找的那些项目。这将使您的查询更有效率,并使您的前端在每个页面响应中的项目计数更加一致。


推荐阅读