使用 GraphQL 获取深层嵌套文档
Fetch deep nested documents with GraphQL
仅在需要时使用 graphql 获取深层嵌套对象的最佳方法是什么。
我说的是这里性能方面
假设您有以下 mongo/mongoose 架构:
User
|
|_ Name
|
|_ Friends (RefId into User)
|
|_ User
|
|_ Friends (RefId into User)
.....
假设每个用户有很多朋友,而这些朋友又有很多其他朋友,
如何决定 populate
在 resolve
函数中的深度?
"just populating" 的幼稚方法可能有害,因为许多查询可能只是 select 字段 name
处于 0 级别,但最终填充 1/2你的数据库。
提前致谢。
最好的方法是让 GraphQL 客户端指定它想要的数据嵌套深度,即让客户端在请求用户的朋友时传递一个参数。
使用 graphql
npm 包,实现如下所示:
const UserType = new GraphQLObjectType({
name: 'NestedUser',
fields: {
...
...
friends: {
type: new GraphQLList(UserType),
args: {
level: {
type: GraphQLInt,
defaultValue: 0,
},
...connectionArgs,
},
resolve: (user, {level, ...args}) => {
// Populate nestedFriends according to the level
return nestedFriends;
},
},
},
});
仅在需要时使用 graphql 获取深层嵌套对象的最佳方法是什么。 我说的是这里性能方面
假设您有以下 mongo/mongoose 架构:
User
|
|_ Name
|
|_ Friends (RefId into User)
|
|_ User
|
|_ Friends (RefId into User)
.....
假设每个用户有很多朋友,而这些朋友又有很多其他朋友,
如何决定 populate
在 resolve
函数中的深度?
"just populating" 的幼稚方法可能有害,因为许多查询可能只是 select 字段 name
处于 0 级别,但最终填充 1/2你的数据库。
提前致谢。
最好的方法是让 GraphQL 客户端指定它想要的数据嵌套深度,即让客户端在请求用户的朋友时传递一个参数。
使用 graphql
npm 包,实现如下所示:
const UserType = new GraphQLObjectType({
name: 'NestedUser',
fields: {
...
...
friends: {
type: new GraphQLList(UserType),
args: {
level: {
type: GraphQLInt,
defaultValue: 0,
},
...connectionArgs,
},
resolve: (user, {level, ...args}) => {
// Populate nestedFriends according to the level
return nestedFriends;
},
},
},
});