将对象存储到数组中,而无需在 AWS AppSync 架构中创建新表

问题描述

我将 AWS amplify 与 React 和 GraphQL API 结合使用。它利用了 AWS AppSync。我对 graphQL 很陌生,目前我的架构是这样的。这是放大应用程序中的架构:

type Note @model {
  id: ID!
  name: String!
  title: String
  movie: String
}

例如,我想在 Note 类型的组件中存储一个对象数组,如下所示:

type Note @model {
  id: ID!
  name: String!
  title: String
  movie: String
  components: []
}

我知道我可以创建一个新表并执行此操作:

type Note @model {
  id: ID!
  name: String!
  title: String
  movie: String
  components: [elements!]!
}
 
 type elements @model {
  id: ID!
  item: String!
}

但是,我不想创建新表。有没有办法做到这一点?

我在我们的平台上看到了类似的问题,他们建议使用 AWSJSON AWS Scalar Types

但是没有使用它们的实际资源。如果那是解决方案,请帮助我完成程序,我们如何为它们编写突变。

解决方法

听起来您确实希望在架构中使用新的 elements 类型,但是您应该配置解析器,使其指向 Note 的解析器所在的任何表中的类似数组的列指向。请记住,graphQL 模式中的类型不一定需要与数据源中的内容一一对应。您的数据库结构是什么样的?

,

我找到了解决办法:

通过使用 AWSJSON,我们可以创建带有映射的数组,而无需在 DynamoDB 中创建新表

复制程序:

首先将 AWSJSON 添加到 Schema Graphql 中,如下所示,

type Note @model {
  id: ID!
  name: String!
  title: String
  movie: String
  components: AWSJSON
}

在使用 create mutation 时,以 JSON 格式传递数据

示例:

let input = `[{\"isPending\":false,\"isAccepted\":false}]`

虽然使用更新突变,但 AWSJSON 存在一个问题,它不会更新现有的地图,而是会在数组中创建一个新地图。

此问题的解决方案是使用 _version