【问题标题】:Graphql query only not null objectsGraphql 只查询非空对象
【发布时间】:2016-10-24 10:59:57
【问题描述】:

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

{
 people{
   pet{
     name
   }
 }
}

结果:

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

我想要的是只得到包含宠物的人,有没有办法在我的解析器上实现这一点而不是编码?

【问题讨论】:

标签: express meteor graphql graphql-js


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

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

    没有办法纯粹在查询中表达您的要求。如果将其放入模式中,您将无法再查询没有宠物的人。所以唯一的办法就是把它写在你的解析函数中。例如,您可以在人员字段中添加一个名为 hasPet 的布尔参数,然后在解析器中执行此操作:

    people(root, { hasPet }){
      // get allPeople
      if (typeof hasPet === 'undefined'){
        return allPeople
      }
      return allPeople.filter((person) => person.hasPet() === hasPet)
    }
    

    不幸的是,这将要求您“向前看”并首先确定一个人是否有宠物,但是如果您使用 DataLoader 之类的东西缓存后端或数据库请求,这实际上并不昂贵,因为无论如何你都必须去取宠物。这样你就可以提早一点。

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

    【讨论】:

      猜你喜欢
      • 2019-06-13
      • 2019-01-26
      • 2018-11-15
      • 2017-11-14
      • 2020-03-01
      • 2020-04-08
      • 1970-01-01
      • 2020-07-24
      • 2022-01-06
      相关资源
      最近更新 更多