我正在GatsbyJs框架内使用GraphQL。
我有多个带有JSON数据的文件。数据的结构与此类似:
{
...,
"sections" / "menuSections"
}
最后一个字段可以是每个文件中的“ sections”或“ menuSections”。我当前的graphQL查询看起来像这样:
{
allDataJson {
nodes {
menuSections
}
}
}
此查询返回正确的'menuSections',但是,不包含'menuSections'的数据文件将以null
的形式返回。我如何才能让GraphQL仅从包含'menuSections'的文件中返回数据,即如何返回存在'menuSections'的数据。我正在寻找像$exists
这样的运算符。
答案 0 :(得分:1)
似乎GraphQL中没有$exists
运算符。相反,您可以做的是在解析器中添加一些逻辑,以检查字段是否不为空。我发现了两个与您有关的老问题:
GraphQL query and check the returned data
GraphQL query: only include field if not null
答案 1 :(得分:1)
如果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
}
}
}
}) { ... }
最坏的情况是最糟糕的情况,我认为您可以定义某种自定义类型来确保menuSections的存在,以便您可以查询allDataWithMenuSections
等,但是如果过滤器工作起来会更简单。