使用 Apollo (graphql) 批量递归查询
Recursive queries in a batch with Apollo (graphql)
Facebook 炫耀在打开 graphql 时提交递归查询的能力,我正在努力寻找允许您高效(网络明智)且轻松地执行此操作的文档。
准确地说,我想查询 child (name) > name child (curName) [ name child ...] 可能直到我耗尽整棵树而不在查询本身内输入任意数量的分支(如果可能的话)。
字段解析器实际解决了它。 graphql server 中基本上有两种查询,一种是根查询解析器,一种是字段解析器。在apollo中看下面的例子,但是背后的思想是一样的:
type Person {
name: String
friends: [Person]
}
type Query {
allPeople($name: String):[Person]
}
schema {
query: Query
}
基于上面的typedef,你可以写一个根查询解析器,如下所示:
{
Query: {
allPeople: (root, args) => PersonModel.find({where: {name: args.name}})
}
}
并且您还需要为 friends
字段编写解析器,如下所示:
{
Person: {
friends: (root, args) => PersonModel.find({where: {friendId: root.id}})
}
}
因为字段解析器,可以无限嵌套。
顺便说一句,为了避免太多的sql statements hiting db,我们可以引入dataloader
包,它来自facebook,它可以将一个异步链中的所有查询组合成一个批处理查询我们在初始化 dataloader
时提供。
上面的代码是一种伪代码,希望能解释清楚。
干杯,
罗恩
Facebook 炫耀在打开 graphql 时提交递归查询的能力,我正在努力寻找允许您高效(网络明智)且轻松地执行此操作的文档。
准确地说,我想查询 child (name) > name child (curName) [ name child ...] 可能直到我耗尽整棵树而不在查询本身内输入任意数量的分支(如果可能的话)。
字段解析器实际解决了它。 graphql server 中基本上有两种查询,一种是根查询解析器,一种是字段解析器。在apollo中看下面的例子,但是背后的思想是一样的:
type Person {
name: String
friends: [Person]
}
type Query {
allPeople($name: String):[Person]
}
schema {
query: Query
}
基于上面的typedef,你可以写一个根查询解析器,如下所示:
{
Query: {
allPeople: (root, args) => PersonModel.find({where: {name: args.name}})
}
}
并且您还需要为 friends
字段编写解析器,如下所示:
{
Person: {
friends: (root, args) => PersonModel.find({where: {friendId: root.id}})
}
}
因为字段解析器,可以无限嵌套。
顺便说一句,为了避免太多的sql statements hiting db,我们可以引入dataloader
包,它来自facebook,它可以将一个异步链中的所有查询组合成一个批处理查询我们在初始化 dataloader
时提供。
上面的代码是一种伪代码,希望能解释清楚。
干杯, 罗恩