graphql,如何按第一个节点名称过滤?
Posted
技术标签:
【中文标题】graphql,如何按第一个节点名称过滤?【英文标题】:graphql, how to filter by the very first node name? 【发布时间】:2019-07-20 23:38:33 【问题描述】:如果我有graphQL
这样的节点
allFile
edges
...
name1 ...
name2 ...
如何按name1
和name2
过滤?
如果我可以将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 个元素拆分