我可以在AppSync中基于嵌套类型的SS查询对象吗

时间:2019-11-12 10:57:55

标签: graphql aws-appsync

我正在将AWS appsync与DynamoDB一起用于我的项目,并且具有以下架构:

type List {
  id: String!
  title: String!
  items: [String!]!       ## it's of String Set (SS) type on DynamoDB
}

type Item {
  id: String!
  name: String!
}

我想获得一个具体的清单以及他们的物品。这些项目的ID在List对象中。例如

e.g:

List
{
  id: "list0001",
  title: "My First list",
  items: ["item_001", "item_002"]
}

Item
{
  id: "item_001",
  name: "Item 001"
}

查询list0001

时,我希望得到以下结果
{
  id: "list0001",
  title: "My First list",
  items: [
    {
      id: "item_001",
      name: "Item 001"
    },
    {
      id: "item_002",
      name: "Item 002"
    }
  ]
}

我知道我可以在Item类型上使用列表ID,然后使用该ID来获取项目,但是如上所述,我希望通过从List类型的字符串集中获取项目来获得它。我想知道这是否可行。如果是这样,两个查询的映射模板是什么。

NB:我正在为带有serverless-appsync-plugin插件的项目使用无服务器。

1 个答案:

答案 0 :(得分:1)

您可以使用两个表ListTableItemTable进行设置。
ListTable将存储有关列表的信息。条目示例如下:

{
    "id": "list_0000",
    "title": "List0"
}

ItemTable用于将项目与它们所属的列表相关联。条目示例如下:

{
    "id": "item_0001",
    "name": "item1",
    "listId": "list_0000"
}

您需要按如下所示修改架构:

type List {
  id: String!
  title: String!
  items: [Item!]!       ## A List of Items
}

type Item {
  id: String!
  name: String!
}

type Query {
  getList(listId: ID!): List
}

此设置将要求设置 2个解析器,在getList上设置1个,在类型items上的字段List上设置1个。

Schema Query List Type Schema

您对getList的请求映射模板如下:

{
    "version": "2017-02-28",
    "operation": "GetItem",
    "key": {
        "id": $util.dynamodb.toDynamoDBJson($ctx.args.listId),
    }
}

响应映射模板为:

$util.toJson($ctx.result)

您对items类型的List的请求映射模板如下:

{
    "version" : "2018-05-29",
    "operation" : "Query",
    "query" : {
        "expression": "listId = :listId",
        "expressionValues" : {
            ":listId" : { "S": "$ctx.source.id" }
        }
    }
}

响应映射模板为:

$util.toJson($ctx.result.items)

运行查询:

query {
  getList(listId: "list_0000") {
    id
    title
    items {
      id
      name
    }
  }
}

会有类似的结果

{
  "data": {
    "getList": {
      "id": "list_0000",
      "title": "List0",
      "items": [
        {
          "id": "item_0001",
          "name": "item1"
        }
      ]
    }
  }
}