graphql,如何按第一个节点名称进行过滤?

graphql, how to filter by the very first node name?

如果我有graphQL个节点比如

allFile {
  edges {
  ...
  }
}
name1 {...}
name2 {...}

如何按 name1name2 进行筛选?

如果我可以将 name1 作为变量传递,我该怎么做,因为它们是第一个节点?

换句话说,通常的方式是

allFile (filter: {extension: {eq: "jpg"} }){
 edges {
  nodes {
   name
  }
 }
}

但是如果我想要像

这样的东西怎么办
(filter: {eq: "name1"}){
 edges {
  nodes {
   name
  }
 }
}

或直接类似

query ($name: String) {
  $name {
    edges {
      node {
        name
        message
      }
    }
  }
}

但似乎不可能 (?)


编辑

我会尝试更好地解释自己。如果我有这棵树:

AllMyPluginNodes {
  edges {
    node {
     name

我可以过滤具有特定扩展名的节点的所有节点(一切照常)。

问题是"AllMyPluginNodes"的名字在变,比如

MyName1Nodes {
 edges {
...
MyName2Nodes {
  edges {
...
MyName3Nodes {
  edges {
...

而且我知道所有这些名字,所以我想专门查询这些名字。

在第一种情况下,我会做类似 AllMyPluginNodes(filter: { extension: { eq: "yml" } }) 的事情来检索 AllMyPluginNodes 节点下的所有 yml 文件,但是现在,我该怎么做呢?

MyName1Nodes (filter: { extension: { eq: "yml" } })

这显然有效,但我希望 MyName1Nodes 成为一个变量,这不是问题,因为我可以通过 createPages 上下文传递变量。问题是,一旦我有了这个变量,如果这是一个 "root" 或 "primary" 节点,我该如何使用它来查询 MyName1Nodes?可能吗?

我可以做类似的事情

query($ext: String) {
MyName1Nodes (filter: { extension: { eq: $ext } })`

但是我不能这样做

query($ext: String, $name: String) {
$name (filter: { extension: { eq: $ext } })`

可以吗?

You can pass variables that can be queried via context.

The automatically created pages can receive context and use that as variables in their GraphQL queries.

gatsby-node.js 创建页面时,尝试将 name 字段添加到页面的上下文中。

createPage({
  path: `/${ edge.node.uid }`,
  component: postTemplate,
  context: {
    uid: edge.node.uid,
    name: name
  }
})

在上下文中后,您可以在 graphql 查询中查询 name

query PostByName($name: String!) {
  allMyPosts(filter: { name: { eq: $name } }) {
    edges {
      node {
        id
        data
        ...
      }
    }
  }
}

此外,您可以通过 pageContext prop.

在您的模板中访问 name
import React from "react"

const Page = ({ pageContext }) => {
  return <div>{pageContext.name}</div>
}

export default Page

无法在另一个查询中使用页面查询的结果。 Gatsby 在评估页面之前通过静态分析提取您的 GraphQL 查询,因此变量不可用。这对于允许您的网站编译为不依赖 GraphQL 服务器 运行ning 的静态服务器端呈现页面很重要(在构建期间仅 运行ning)。

如果您想根据 GraphQL 查询的结果生成页面或其他效果,您可以按照@ksav 上面概述的那样做:运行一个查询(或几个)在 createPages 内,然后为它们中的每一个调用 createPage,将结果 name 作为上下文传递,允许它在页面查询中用作变量.