ali*_*hur 3 javascript amazon-dynamodb graphql aws-amplify
我是使用 aws-amplify 的新手,并且有一个与此类似的函数,它会调用一个查询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
}
Run Code Online (Sandbox Code Playgroud)
Ben*_*Ben 11
您应该考虑将 GSI 添加到表中的“已启用”项目,然后进行查询,而不是扫描每个项目然后进行过滤。这将在查询时更有效(即更快和更便宜),但代价是写入和存储成本略高。通常这是一个很好的权衡。
不管您是查询还是扫描,一旦结果集的大小变得太大(最大 1MB),您将不得不处理 DynamoDB 分页。如果结果集达到阈值,那么您将获得第一页结果和LastEvaluatedKey
. 然后您需要再次查询,将LastEvaluatedKey
值作为ExclusiveStartKey
. 你一直这样做,直到你没有LastEvaluatedKey
回来。
如果您更新您的 AppSync 架构和解析器以将其LastEvaluatedKey
作为 a paginationToken
(或您想调用的任何名称)传回,那么您可以从传递最新令牌的应用程序重复重新查询以获取下一页结果。如果您一次不需要所有结果,您可能会考虑懒惰地调用它们,以便仅在需要时才要求另一个页面或结果。
还有一些其他的方法。
如果您知道过滤后的结果集始终小于 1MB,则一种方法是将 DynamoDB 数据源换成 Lambda,并在返回过滤结果之前在 lambda 内的循环中逐步扫描和过滤(或查询)DynamoDB 页面到您的 AppSync 解析器,然后从那里返回到您的应用程序。
问题包括:
或者,如果您可以将您的项目(或您的“isEnabled”项目)分割成多个组,您可以像以前一样在累积结果之前扇出您的扫描(或查询)以实施并行扫描(或查询)。这可能会实现更快的扫描,但您仍然会受到时间和有效负载大小的限制,因此对于大型表扫描仍然存在问题。
LastEvaluatedKey
/ ExclusiveStartKey
)。添加 GSI、查询它(而不是扫描),然后将分页添加到您的 AppSync 架构和应用程序是最强大的解决方案。
归档时间: |
|
查看次数: |
2307 次 |
最近记录: |