繁体   English   中英

如何在 aws amplify 中使用 graphQL 限制

[英]How to use graphQL limit in aws amplify

我是使用 aws-amplify 的新手,并且有一个与此类似的 function,它会命中一个名为listItems的查询并返回isEnbled为 true 的项目(来自 DynamoDB)。 我希望这可以过滤整个可能很大的表。 因此,我无法简单地设置 1000 之类的限制并保持不变。 有没有办法指定无限查询并扫描表中的所有内容? 还是我应该使用其他属性?

 import { API } from 'aws-amplify'

 export async function getAllEnabledListItems() {
      const { data } = await API.graphql({
      query: queries.listItems,
      variables: { filter: { isEnabled: { eq: true } }, limit: 10000 },
      authMode: 'AMAZON_COGNITO_USER_POOLS' 
    })
 return data
 }

DynamoDB 扫描与查询

您应该考虑将 GSI 添加到表中的“已启用”项目,然后对其进行查询,而不是扫描每个项目然后进行过滤。 这将在查询时更有效(即更快和更便宜),但代价是写入和存储成本略高。 通常这是一个很好的权衡。

分页

不管您是查询还是扫描,一旦结果集的大小变得太大(最大 1MB),您将不得不处理 DynamoDB 分页。 如果结果集达到阈值,那么您将获得第一页结果和LastEvaluatedKey 然后,您需要再次查询,将LastEvaluatedKey值作为ExclusiveStartKey传递。 你一直这样做,直到你没有返回LastEvaluatedKey

如果您更新 AppSync 架构和解析器以将此LastEvaluatedKey作为paginationToken (或您想要调用的任何名称)传回,那么您可以从您的应用程序重复重新查询并传递最新的令牌以获取下一页结果。 如果您一次不需要所有结果,您可能会考虑懒惰地调用这些结果,只在需要时才请求另一个页面或结果。

其他注意事项

还有一些其他的方法。

如果您知道过滤后的结果集将始终小于 1MB,则一种方法是将您的 DynamoDB 数据源换成 Lambda,并在返回过滤结果之前在 lambda 内的循环中逐步扫描和过滤(或查询)DynamoDB 页面到您的 AppSync 解析器,然后从那里返回到您的应用程序。

问题包括:

  • 如何保证过滤后的结果集始终小于 1MB(AppSync 的限制)
  • 如何保证lambda及时返回(AppSync时间限制)
  • 您正在扫描整个表(如果您扫描而不是查询),但您只对这些项目的子集(“isEnabled”项目)感兴趣

或者,如果您可以将您的项目(或“isEnabled”项目)分成多个组,您可以在像以前一样累积结果之前将扫描(或查询)展开以实现并行扫描(或查询)。 这可能会实现更快的扫描,但您仍然会受到时间和有效负载大小的限制,因此对于大型表扫描仍然存在问题。

概括

  • DynamoDB 强制分页结果(最大 1MB)
  • AppSync 限制负载大小(最大 1MB,如果您也打算使用订阅,则更小)
  • DynamoDB 扫描的效率低于查询。 考虑添加 GSI,以便您可以查询而不是扫描/过滤。
  • 在 Lambda 或 AppSync VTL 中累积结果页面的技巧很脆弱,可能不适用于大表
  • 在您的应用程序中实现分页将需要更新您的 AppSync 架构以传入和传出 DynamoDB“分页令牌”( LastEvaluatedKey / ExclusiveStartKey )。

添加 GSI,对其进行查询(而不是扫描),然后将分页添加到 AppSync 架构和应用程序是最强大的解决方案。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM