GraphQL 查询:如果不为空,则仅包含字段

Posted

技术标签:

【中文标题】GraphQL 查询:如果不为空,则仅包含字段【英文标题】:GraphQL query: only include field if not null 【发布时间】:2016-07-26 21:39:09 【问题描述】:

只有当字段不是null 时,GraphQL 是否有可能让客户端告诉服务器它想要一个字段?

给定查询

query HeroAndFriends 
  hero 
    name
    friends 
      name
    
  

响应应该看起来像


  "data": 
    "hero": 
      "friends": [
        
          "name": "Luke Skywalker"
        ,
        
          "name": "Han Solo"
        ,
        
          "name": "Leia Organa"
        
      ]
    
  

而不是


  "data": 
    "hero": 
      "name": null,
      "friends": [
        
          "name": "Luke Skywalker"
        ,
        
          "name": "Han Solo"
        ,
        
          "name": "Leia Organa"
        
      ]
    
  

这是否可能在不违反 GraphQL 规范的情况下实现?

【问题讨论】:

只是想知道:这种行为的用例是什么? @AhmadFerdousBinAlam 我有一个带有默认(非空)值的 Kotlin 数据类,我不想在反序列化时被覆盖。 @Ahmad Ferdous,关于用例,如果服务器返回具有稀疏数据的项目数组怎么办?就像每个对象都有很多字段一样,其中只有少数实际上包含某些内容而不是 null。将这些字段从有效负载中排除以减小 api 响应的整体大小不是更好吗? 【参考方案1】:

据我所知这是不可能的,有directives 像@skip 和@include。指令,但它们需要一个变量,我认为您可以与 graphql 团队合作,将指令扩展为仅包含不为空的字段。

【讨论】:

【参考方案2】:

你可以在前端使用这个 ES6 语法:

Object.keys(data).forEach((key) => (data[key] == null) && delete data[key]);

【讨论】:

以上是关于GraphQL 查询:如果不为空,则仅包含字段的主要内容,如果未能解决你的问题,请参考以下文章

sql语句中要查询一个字符串字段不为空怎么写

在查询SQL语句中为空或不为空怎么写

在查询SQL语句中为空或者不为空的字段应该怎么写?

sql查询不为空的字段

Oracle中查询某字段不为空的SQL语句怎么写

如果特定字段不为空,mysql将值设置为空