graphql - 在 GraphQL 中以最佳方式获取数据
问题描述
如何编写解析器,以便我可以在每个解析器中生成数据库子查询,并有效地组合所有解析器并立即获取数据?
对于以下架构:
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得到答案会很有帮助)
解决方案
推荐和最常见的方法是使用data loader
.
Adata loader
收集有关fields
从哪个过滤器加载table
以及使用哪些where
过滤器的信息。
我没有在 Java 中使用过 GraphQL,所以我只能为您提供如何自己实现它的指导。
context
创建数据加载器的实例并将其作为参数 传递给解析器。- 您的解析器应该将
table name
、 列表field names
和列表where conditions
传递给数据加载器并返回一个承诺。 - 一旦所有的解析器都执行了,你的数据加载器应该合并这些列表,这样你最终每个表只有一个查询。
- 您应该
remove duplicate field
命名并combine the where conditions
使用or
关键字。 - 查询执行后,您可以将所有这些数据返回给解析器并让它们过滤数据(因为我们使用
or
关键字组合了条件) - 作为一项高级功能,您的数据加载器可以在将数据返回到解析器之前应用 where 条件,这样他们就不必过滤它们。
推荐阅读
- javascript - 如何获取void函数的调用次数?
- composer-php - 作曲家没有从 composer.lock 中删除条目
- asp.net - 避免来自爬虫和其他机器人的会话垃圾邮件
- xml - Response.Return_ 标记中的名称“return”与 *Result.XMLName 中的名称“Result”冲突
- javascript - SCRIPT1003:预期为“:”
- mysql - 为多个计数编写自定义 SQL 查询
- android - onNewIntent 没有被解雇
- angular - 以编程方式将焦点更改为新的表单元素 - 复杂的用例
- javafx - 当 JavaFX javafx.scene.control.Labeled 元素的宽度调整为适合文本时
- sql - sql中单引号和双单引号的区别