[英]How to enable the CORS mode on frontend side in GraphQL/AWS Amplify?
[英]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
}
您应该考虑将 GSI 添加到表中的“已启用”项目,然后对其进行查询,而不是扫描每个项目然后进行过滤。 这将在查询时更有效(即更快和更便宜),但代价是写入和存储成本略高。 通常这是一个很好的权衡。
不管您是查询还是扫描,一旦结果集的大小变得太大(最大 1MB),您将不得不处理 DynamoDB 分页。 如果结果集达到阈值,那么您将获得第一页结果和LastEvaluatedKey
。 然后,您需要再次查询,将LastEvaluatedKey
值作为ExclusiveStartKey
传递。 你一直这样做,直到你没有返回LastEvaluatedKey
。
如果您更新 AppSync 架构和解析器以将此LastEvaluatedKey
作为paginationToken
(或您想要调用的任何名称)传回,那么您可以从您的应用程序重复重新查询并传递最新的令牌以获取下一页结果。 如果您一次不需要所有结果,您可能会考虑懒惰地调用这些结果,只在需要时才请求另一个页面或结果。
还有一些其他的方法。
如果您知道过滤后的结果集将始终小于 1MB,则一种方法是将您的 DynamoDB 数据源换成 Lambda,并在返回过滤结果之前在 lambda 内的循环中逐步扫描和过滤(或查询)DynamoDB 页面到您的 AppSync 解析器,然后从那里返回到您的应用程序。
问题包括:
或者,如果您可以将您的项目(或“isEnabled”项目)分成多个组,您可以在像以前一样累积结果之前将扫描(或查询)展开以实现并行扫描(或查询)。 这可能会实现更快的扫描,但您仍然会受到时间和有效负载大小的限制,因此对于大型表扫描仍然存在问题。
LastEvaluatedKey
/ ExclusiveStartKey
)。添加 GSI,对其进行查询(而不是扫描),然后将分页添加到 AppSync 架构和应用程序是最强大的解决方案。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.