Gatsbyjs 中的 GraphQL - 只有 Return 包含特定字段的数据

GraphQL in Gatsbyjs - Only Return Data Which Contains a Particular Field

我在 GatsbyJs 框架内使用 GraphQL。

我有多个包含 JSON 数据的文件。数据结构类似这样:

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

每个文件中的最后一个字段可以是 'sections' 或 'menuSections'。我当前的 graphQL 查询如下所示:

{
  allDataJson {
    nodes {
      menuSections
    }
  }
}

此查询 return 是正确的 'menuSections',但是,没有 'menuSections' 的数据文件被 return 编辑为 null。我怎样才能让 GraphQL 仅从包含 'menuSections' 的文件中获取 return 数据,即如何 return 存在 'menuSections' 的数据。我正在寻找像 $exists.

这样的运算符

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

如果 sections & menuSections 是字符串或字符串数​​组,也许你可以过滤 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 等,但如果过滤器有效,那就简单多了。