【问题标题】:Fetching the data optimally in GraphQL在 GraphQL 中以最佳方式获取数据
【发布时间】:2018-11-07 22:03:06
【问题描述】:

如何编写解析器,以便我可以在每个解析器中生成数据库子查询,并有效地组合所有这些子查询并一次获取数据?

对于以下架构:

type Node {
    index: Int!
    color: String!
    neighbors(first: Int = null): [Node!]!
}

type Query {
    nodes(color: String!): [Node!]!
}

schema {
    query: Query
}

执行以下查询:

{
    nodes(color: "red") {
        index
        neighbors(first: 5) {
            index
        }
    }
}

数据存储:

在我的数据存储中,节点和邻居存储在单独的表中。我想编写一个解析器,以便我们可以最佳地获取所需的数据。

如果有类似的例子,请分享详细信息。 (参考graphql-java得到答案会很有帮助)

【问题讨论】:

    标签: graphql graphql-java


    【解决方案1】:

    DataFetchingEnvironment 通过DataFetchingEnvironment#getSelectionSet 提供对子选择的访问。这意味着,在您的情况下,您可以从 nodes 解析器中知道还需要 neighbors,因此您可以适当地 JOIN 并准备结果。

    getSelectionSet 当前实现的一个限制是它不提供有关条件选择的信息。因此,如果您正在处理接口和联合,则必须从DataFetchingEnvironment#getField 开始手动收集子选择。这很可能会在 graphql-java 的未来版本中得到改进。

    【讨论】:

      【解决方案2】:

      推荐和最常用的方法是使用data loader

      data loader 收集有关从哪个table 加载哪个fields 以及要使用哪个where 过滤器的信息。

      我没有在 Java 中使用过 GraphQL,所以我只能为您提供如何自己实现它的指导。

      1. 创建数据加载器的实例并将其作为context 参数传递给解析器。
      2. 您的解析器应该将table namefield names 列表和where conditions 列表传递给数据加载器并返回一个promise。
      3. 一旦所有解析器都执行完毕,您的数据加载器应该合并这些列表,这样您最终每个表只需要一个查询。
      4. 您应该使用 or 关键字来命名 remove duplicate fieldcombine the where conditions
      5. 执行查询后,您可以将所有这些数据返回给解析器并让它们过滤数据(因为我们使用 or 关键字组合了条件)
      6. 作为一项高级功能,您的数据加载器可以在将数据返回给解析器之前应用 where 条件,这样他们就不必过滤它们。

      【讨论】:

        猜你喜欢
        • 2021-07-17
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-04-09
        • 1970-01-01
        • 2013-03-18
        • 2017-06-30
        相关资源
        最近更新 更多