使用 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 类别。在我看来,我只能使用getItemlistItems 查询。

我想知道是否有办法对 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 错误

AWS Amplify 在创建 DynamoDB 表后创建全局二级索引

在 AWS Amplify GraphQL DynamoDB 中按另一个表的字段(也称为交叉表或嵌套过滤)过滤列表查询