【问题标题】:AWS AppSync get child results based on parent resultAWS AppSync 根据父结果获取子结果
【发布时间】:2020-09-07 02:30:15
【问题描述】:

我将 GraphQL 和 DynamoDB 与邻接列表模式一起使用,因为我只使用一个表。

假设我有架构 -

type GrandParent {
   id: ID!
   children: [Parent]
}

type Parent {
   id: ID!
   children: [Child]
}

type Child {
   id: ID!
}

type Query {
   getGrandParent(id: ID): GrandParent
}

对于 dynamodb,我有以下主键结构 -

为祖父母 pk = GRANDPARENT_<id>, sk = GRANDPARENT

为家长 pk = PARENT_<ID>, sk = GRANDPARENT_<id>

为孩子 pk = CHILD_<id>, sk = PARENT_<id>

使用将反转密钥的 GSI。

所以,给定一个祖父母 ID,我可以使用 GSI 找到所有父母,因为我知道祖父母 ID,所以我可以这样做 - where sk = GRANDPARENT_<id> and pk begins with PARENT_ID 这将把我带回所有父母,但是我怎么能得到这些父母的ID,现在去获取所有的孩子记录吗?是否可以在一个 graphql 请求中多次访问数据库?

【问题讨论】:

  • 更好地使用Amazon Neptune 来建立关系。 Neptune 是一个图形数据库,而 DynamoDB 是一个键值数据库。
  • 我明白你为什么要考虑使用图表。虽然这是我在现有应用程序上遇到的一个一次性问题,但不幸的是我无法更改数据库
  • 如果我正确理解了您的问题,您可以附加一个带有 Parent 类型子代的解析器,并编写一个查询来获取 id = ctx.source.id (即父 ID)的子代。所以这样一来,就只有一个请求有多个DB事务了。
  • 一个查询没问题(graphql的基本特性)...getGrandParent(id: $id) { id children { id children { id ... ...问题是每个级别解析器中没有太多的db请求来返回所有数据...github.com/graphql/dataloader

标签: graphql amazon-dynamodb aws-appsync


【解决方案1】:

感谢 cmets 中的人 - 将他们的建议拼凑在一起,我能够弄清楚。我真正的症结是不知道如何从 resolved 父级获取值,使用 DynamoDB 的 AppSync 解析器映射模板我能够使用 #ctx.source.id 获取父级 ID,因此我可以构建通过正确查询 -

{
    "version" : "2017-02-28",
    "operation" : "Query",
    "query" : {
        "expression" : "#sk = :sk and begins_with(#pk, :pk)",
        "expressionNames" : {
            "#pk" : "pk",
            "#sk" : "sk"
        },
        "expressionValues" : {
            ":pk" : $util.dynamodb.toDynamoDBJson("CHILD"),
            ":sk" : $util.dynamodb.toDynamoDBJson("PARENT_$context.source.id")
       }
    },
    "index": "invertedIndex"
}

【讨论】:

  • 已解析的父节点通常作为第一个解析器参数传递
  • 标准解析器参数 (parent_or_root, args, context, info) - 将输入/数据传递给嵌套(子)解析器,在 YT 旁边的 SO 链接中进行了说明
猜你喜欢
  • 2019-02-23
  • 2021-01-29
  • 1970-01-01
  • 2022-10-14
  • 1970-01-01
  • 2014-01-09
  • 2023-03-10
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多