GatsbyJS中的GraphQL过滤器

时间:2019-01-29 05:31:08

标签: graphql gatsby

我无法理解如何在GatsbyJS中为GraphQL查询编写过滤器。

这有效:

filter: { contentType: { in: ["post", "page"] }

我基本上需要相反的操作,例如:

filter: { "post" in: { contentTypes } } // where contentTypes is array

这不起作用,因为“期望名称”(在我的示例中为“ post”)。

经过GatsbyJS docs之后,我发现了这一点:

elemMatch: short for element match, this indicates that the field you are filtering will return an array of elements, on which you can apply a filter using the previous operators

filter:{
  packageJson:{
    dependencies:{
      elemMatch:{
        name:{
          eq:"chokidar"
        }
      }
    }
  }
}

太好了!那就是我所需要的!所以我尝试了,然后得到了

error GraphQL Error Field "elemMatch" is not defined by type markdownRemarkConnectionFrontmatterTagsQueryList_2.

markdownRemarkConnectionFrontmatterTagsQueryList_2中定义的关键字是:

  • eq:字符串| null;
  • ne:字符串| null;
  • regex:字符串| null;
  • glob:字符串| null;
  • 在:数组| null;

当文档中提到更多elemMatch之类的关键字时,为什么我仅限于这些关键字?为什么不允许使用过滤器结构“ element in:{array}”?

如何创建此过滤器?

1 个答案:

答案 0 :(得分:1)

按数组中的值过滤

假设您有一个降价博客,其中categories为字符串数组,您可以像这样在categories中过滤带有“ historical”的帖子:

{
  allMarkdownRemark(filter:{
    frontmatter:{
      categories: {
       in: ["historical"]
      }
    }
  }) {
    edges {
      node {
        id
        frontmatter {
          categories
        }
      }
    }
  }
}

您可以在Gatsby.js docs中的任何graphiq块中尝试此查询。


ElemMatch

我认为elemMatch仅对具有对象数组的字段“打开”;类似于comments: [{ id: "1", content: "" }, { id: "2", content: ""}]。这样,您可以在每个comment的字段上应用进一步的过滤器:

comments: { elemMatch: { id: { eq: "1" } } }

这是一个示例,您可以在gatsby文档的graphiq块中进行尝试:

// only show plugins which have "@babel/runtime" as a dependency
{
  allSitePlugin (filter:{
    packageJson:{
      dependencies: {
        elemMatch: {
          name: {
            eq: "@babel/runtime"
          }
        }
      }
    }
  }) {
    edges {
      node {
        name
        version
        packageJson {
          dependencies {
            name
          }
        }
      }
    }
  }
}