我在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 查询:如果不是空,则仅包含字段