GraphQL-仅返回包含特定字段的数据

时间:2019-04-10 08:15:53

标签: json graphql gatsby graphql-js

我正在GatsbyJs框架内使用GraphQL。

我有多个带有JSON数据的文件。数据的结构与此类似:

{
 ...,
 "sections" / "menuSections"
}

最后一个字段可以是每个文件中的“ sections”或“ menuSections”。我当前的graphQL查询看起来像这样:

{
  allDataJson {
    nodes {
      menuSections
    }
  }
}

此查询返回正确的'menuSections',但是,不包含'menuSections'的数据文件将以null的形式返回。我如何才能让GraphQL仅从包含'menuSections'的文件中返回数据,即如何返回存在'menuSections'的数据。我正在寻找像$exists这样的运算符。

2 个答案:

答案 0 :(得分:1)

似乎GraphQL中没有$exists运算符。相反,您可以做的是在解析器中添加一些逻辑,以检查字段是否不为空。我发现了两个与您有关的老问题:
GraphQL query and check the returned data
GraphQL query: only include field if not null

答案 1 :(得分:1)

如果sections和menuSection是字符串或字符串数​​组,也许您可​​以过滤null

{
  "menuSections": "..."
}
// query
{
  allDataJson(filter: {
    menuSections: {
      ne: null
    }
  }) {
    nodes {
      menuSections
    }
  }
}

如果它们是对象,则仍然可以过滤null,但是必须将其应用于该对象内部的一个字段。如果您的对象没有公共字段,则将无法使用:

{
  "menuSections": {
    "menuSectionField": "..."
  }
}
// query
{
  allDataJson(filter: {
    menuSections: {
      menuSectionField: {
        ne: null
      }
    }
  }) {
    nodes {
      menuSections
    }
  }
}

如果它们是对象数组,则可以使用elemMatch做同样的事情:

{
  "menuSections": [
    { "menuSectionField": "..." },
    { "other": "..." }
  ]
}
// query
allDataJson(filter: {
    menuSections: {
      elemMatch: {
        menuSectionField: {
          ne: null
        }
      }
    }
  }) { ... }

最坏的情况是最糟糕的情况,我认为您可以定义某种自定义类型来确保menuSections的存在,以便您可以查询allDataWithMenuSections等,但是如果过滤器工作起来会更简单。