Graphql 只查询不空对象
Graphql query only not null objects
我正在尝试执行这样的查询:
{
people{
pet{
name
}
}
}
结果:
{
"people": {
"pet": null
}
},
{
"people": {
"pet": {
name: "steve"
}
}
}
我想要的是只获取包含宠物的人,有没有什么方法可以实现这个而不是在我的解析器上编码?
这不可能按照您描述的方式进行。 GraphQL 将调用解析函数来获取数据。如果您不想在响应中包含某些数据,则必须在服务器的某个位置对其进行过滤。您唯一可以控制的是查询、模式和解析函数。
无法仅在查询中表达您的要求。如果将其放入模式中,您将无法再查询没有宠物的人。所以唯一的方法就是把它写在你的解析函数中。例如,您可以将一个名为 hasPet
的布尔参数添加到您的 people 字段,并在解析器中执行此操作:
people(root, { hasPet }){
// get allPeople
if (typeof hasPet === 'undefined'){
return allPeople
}
return allPeople.filter((person) => person.hasPet() === hasPet)
}
不幸的是,这将要求您 'look ahead' 并首先确定一个人是否有宠物,但如果您使用 DataLoader 之类的东西缓存后端或数据库请求,这不是'这实际上并不昂贵,因为无论如何您都必须去取宠物。这样你就可以早一点取到它。
如果您要从数据库中提取人员,那么在数据库中过滤他们当然是有意义的,而不是在 resolve 函数中。
实际上,filter: { pet: {ne: null} }
过滤是可能的:
query allPeople(filter: { people: { pet: {ne: null} } }) {
people {
pet
}
}
我正在尝试执行这样的查询:
{
people{
pet{
name
}
}
}
结果:
{
"people": {
"pet": null
}
},
{
"people": {
"pet": {
name: "steve"
}
}
}
我想要的是只获取包含宠物的人,有没有什么方法可以实现这个而不是在我的解析器上编码?
这不可能按照您描述的方式进行。 GraphQL 将调用解析函数来获取数据。如果您不想在响应中包含某些数据,则必须在服务器的某个位置对其进行过滤。您唯一可以控制的是查询、模式和解析函数。
无法仅在查询中表达您的要求。如果将其放入模式中,您将无法再查询没有宠物的人。所以唯一的方法就是把它写在你的解析函数中。例如,您可以将一个名为 hasPet
的布尔参数添加到您的 people 字段,并在解析器中执行此操作:
people(root, { hasPet }){
// get allPeople
if (typeof hasPet === 'undefined'){
return allPeople
}
return allPeople.filter((person) => person.hasPet() === hasPet)
}
不幸的是,这将要求您 'look ahead' 并首先确定一个人是否有宠物,但如果您使用 DataLoader 之类的东西缓存后端或数据库请求,这不是'这实际上并不昂贵,因为无论如何您都必须去取宠物。这样你就可以早一点取到它。
如果您要从数据库中提取人员,那么在数据库中过滤他们当然是有意义的,而不是在 resolve 函数中。
实际上,filter: { pet: {ne: null} }
过滤是可能的:
query allPeople(filter: { people: { pet: {ne: null} } }) {
people {
pet
}
}