使用 Amplify 库的基于 DynamoDB GSI 的查询
Posted
技术标签:
【中文标题】使用 Amplify 库的基于 DynamoDB GSI 的查询【英文标题】:DynamoDB GSI based queries using Amplify Libraries 【发布时间】:2020-09-20 03:36:11 【问题描述】:对于 android 应用程序,我曾经在使用 GSI 时使用 AppSync 客户端从 DynamoDB 中查询数据。如今,我正在尝试使用 Amplify Libraries 来利用 DataStore 功能。阅读文档和代码后,我意识到 Amplify 库不支持此类查询,除非我弄错了。到目前为止,我发现的唯一方法是使用列表并对结果应用过滤器,但考虑到读取容量,这并不理想。有人找到有关此问题的文件吗?在这种情况下可以使用任何有用的插件吗?
有关说明,请参阅 AWS 文档中的以下架构:
type Item @model
@key(fields: ["orderId", "status", "createdAt"])
@key(name: "ByStatus", fields: ["status", "createdAt"], queryField: "itemsByStatus")
orderId: ID!
status: Status!
createdAt: AWSDateTime!
name: String!
enum Status
DELIVERED
IN_TRANSIT
PENDING
UNKNOWN
使用 AppSync,您可以通过这种方式根据 ByStatus GSI 查询数据:
appSyncClient.query(itemsByStatusQuery.builder().build())
现在,我正在使用 Amplify API 类别。在我看来,我只能使用getItem
或listItems
查询。
我想知道是否有办法对 Amplify 库做同样的事情。
【问题讨论】:
【参考方案1】:感谢您的澄清。不幸的是,该特定功能尚未在 Amplify 中实现。它在我们团队的雷达上,但我们现在没有预计到达时间。随时open an issue,如果您有兴趣,可以跟踪进度。
因为听起来您已经配置了 API 和 DataStore 类别,所以值得一提的是,您应该能够通过使用 Amplify.DataStore.query
并传入条件来获得等效的数据集(请参阅我之前回复中的链接) . Amplify 有一个同步过程,可以使本地 DataStore 与 API(在本例中为 DynamoDb)保持同步。如果这听起来像是一个合适的解决方法,请查看同步过程中的details。
【讨论】:
【参考方案2】:就文档而言,您可以找到有关查询 DataStore here 的信息。如果您也在使用 API 类别,您可以找到查询文档here。
需要注意的重要一点是,GSI 是根据您的 GraphQL 模型创建/使用的。 connection 指令将根据架构中模型之间的关系为您生成 GSI。之后,您可以使用生成的模型来发出查询,而无需显式指定 GSI。
如果您对此还有其他问题,我们很乐意为您提供帮助。
【讨论】:
Raf,感谢您的回答,我提供了更多详细信息来澄清我的问题。我在阅读了您共享的相同文档后提出了这个问题。以上是关于使用 Amplify 库的基于 DynamoDB GSI 的查询的主要内容,如果未能解决你的问题,请参考以下文章
模拟和测试由 Amplify @model 创建的 DynamoDB 表
如何删除并重新创建由 mock api 创建的本地 dynamodb/appsync/amplify 数据库?
如何从 Amplify - AppSync - ElasticSearch - DynamoDB Stack 中获取看不见的附近文档?
AWS Amplify + Graphql + Dynamodb:突变时出现 ConditionalCheckFailedException 错误