Graphql 仅查询非空对象

问题描述 投票:0回答:3

我正在尝试执行这样的查询:

{
 people{
   pet{
     name
   }
 }
}

结果:

{
 "people": {
   "pet": null
 }
},
{
 "people": {
   "pet": {
     name: "steve"
  }
 }
}

我想要的是只获得包含宠物的人,有什么方法可以实现这一点而不是在我的解析器上编码?

express meteor graphql graphql-js
3个回答
13
投票

实际上,通过

filter: { pet: {ne: null} }
过滤是可以的:

query allPeople(filter: { people: { pet: {ne: null} } }) {
    people {
       pet
    }
}

4
投票

按照你描述的方式这是不可能的。 GraphQL 将调用解析函数来获取数据。如果您不希望响应中包含某些数据,则必须在服务器上的某个位置对其进行过滤。您唯一可以控制的是查询、模式和解析函数。

无法纯粹在查询中表达您的需求。如果将其放入架构中,您将无法再查询没有宠物的人。因此,唯一的方法是将其写入您的解析函数中。例如,您可以将一个名为

hasPet
的布尔参数添加到您的 people 字段,并在解析器中执行此操作:

people(root, { hasPet }){
  // get allPeople
  if (typeof hasPet === 'undefined'){
    return allPeople
  }
  return allPeople.filter((person) => person.hasPet() === hasPet)
}
不幸的是,这需要你“向前看”并首先弄清楚一个人是否有宠物,但如果你使用 DataLoader 之类的东西缓存后端或数据库请求,这实际上并不昂贵,因为无论如何你都得把宠物带回来。这样你就可以早一点获取它。

如果您从数据库中获取人员,那么在数据库中过滤他们当然是有意义的,而不是在解析函数中进行过滤。


0
投票
import { Not, Repository } from 'typeorm'; return await this.MyRepository.find({ where: { My_Field: Not(null) } });
    
© www.soinside.com 2019 - 2024. All rights reserved.