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



我在GatsbyJs框架中使用GraphQL。

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

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

最后一个字段可以是每个文件中的"部分"或"菜单部分"。我当前的 graphQL 查询如下所示:

{
  allDataJson {
    nodes {
      menuSections
    }
  }
}
此查询返回正确的"菜单部分",

但是,没有"菜单部分"的数据文件将作为null返回。如何让 GraphQL 仅从包含"menuSection"的文件返回数据,即如何返回存在"menuSection"的数据。我正在寻找像$exists这样的运营商。

如果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
        }
      }
    }
  }) { ... }

最坏的情况是,我认为您可以定义某种自定义类型来确保菜单部分的存在,以便您可以查询allDataWithMenuSections等,但如果过滤器有效,那就简单多了。

看起来 GraphQL 中没有$exists运算符。相反,您可以做的是在解析器中添加一些逻辑来检查字段是否不为 null。我发现了两个与您相关的旧问题:
GraphQL 查询并检查返回的数据
GraphQL 查询:如果不是空,则仅包含字段

最新更新