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

Posted

技术标签:

【中文标题】graphql,如何按第一个节点名称过滤?【英文标题】:graphql, how to filter by the very first node name? 【发布时间】:2019-07-20 23:38:33 【问题描述】:

如果我有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 上下文传递变量。问题是,一旦我有了这个变量,如果这是一个“根”或“主”节点,我如何使用它来查询MyName1Nodes?有可能吗?

我可以做类似的事情

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

但我不能这样做

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

可以吗?

【问题讨论】:

已关闭,谢谢告知 【参考方案1】:

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

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

【讨论】:

我明白他在说什么,实际上这正是我正在做的,createPages 正在通过上下文将变量发送到模板,然后查询特定节点。问题是我正在使用的插件是在系统的根目录中创建节点,所以插件没有将它们的节点分组在一些 AllMyCreatedNodes 下,而是将它们创建为“主要”节点(如果这样说的话) .所以问题还是一样,是否可以根据树的第一个节点进行过滤? 所以你只有一个根节点 (Query),但我假设你的意思是它们就在它的正下方并且你想动态地获取它们(即不命名它们)。在这种情况下,您可以使用onCreateNode API 并按internal.owner 过滤,然后将它们添加到其他地方的列表中,供您在createPages 中使用。不是很简单,但它是可行的。 是的,这就是我的想法,修改插件创建的节点并将它们分组到一个已知节点下,以便以后可以使用它来查询这些节点。 但令人惊讶的是,graphQL 不允许搜索(用你的话来说)直接在根节点下的节点。实际上这是问题,所以答案是它不允许...也许您想将此添加为答案,我将关闭问题【参考方案2】:

You can pass variables that can be queried via context.

自动创建的页面可以接收上下文并将其用作 GraphQL 查询中的变量。

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 属性访问模板中的 name

import React from "react"

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


export default Page

【讨论】:

是的,但我不是在问这个。我在问如何搜索“allMyPosts”,如果我想将“allMyPosts”定义为变量具有的值,我该如何定义graphql查询? 所以您不想从任何地方获取数据,而是在引导期间创建一些任意源节点? 一个插件正在创建这些节点,我知道这些节点的名称,但是如果这些节点是“根”节点,我如何查询它们?

以上是关于graphql,如何按第一个节点名称过滤?的主要内容,如果未能解决你的问题,请参考以下文章

Graphene/Django (GraphQL):如何使用查询参数来排除与特定过滤器匹配的节点?

如果第 5 个元素是“名称”,则按每第 4 个元素拆分列表;如果第 5 个元素是地址,则按第 5 个元素拆分

按第一个字符分组

如何使用字段作为来自一个 graphql 查询的过滤器来获取位于单独查询中的流体图像?

按第一行中的字段排序两行,然后按第二行的长度排序

MYSQL先按第一个字段排序,若相同再按第二个字段排序,如何实现?