Gatsby.js:通过嵌套对象属性过滤GraphQL查询

时间:2018-01-30 23:49:12

标签: filter graphql graphql-js contentful gatsby

我正在一个新闻网站上工作,这个网站上有文章,每个文章都有一个或多个作者。如果您点击作者的姓名,它将带您进入显示其信息的页面以及他们所贡献的文章列表。

因此每篇文章都有一个authors属性,而该属性又是一个author对象的数组,其属性为:全名,slug(全名的小写版本,空格用短划线替换< / em>)等。

在定义查询时,是否可以通过特定作者的slug过滤文章?

query authorQuery($slug: String!) {
  allContentfulArticle(filter: { //not sure what to do here }) {
    edges {
      node {
        title
        slug
        authors {
          name
          slug
        }
      }
    }
  }
}

我的另一个选择是加载所有文章,然后在组件中设置过滤器,如下所示:

const articles = data.allContentfulArticle.edges.filter(({ node }) => {
  return node.authors.some((author) => author.slug === data.contentfulAuthor.slug);
});

这不会是世界末日,但它违反了仅加载所需数据的GraphQL原则。

1 个答案:

答案 0 :(得分:3)

如果我理解正确,你想在这里实现什么,你想按作者分组文章。 如果您查询并将过滤器应用于allContentfulAuthor,则可以实现此目的 并请求article字段,如下所示:

{
  allContentfulAuthor(filter: {slug: {eq: "myslug"}}) {
    edges {
      node {
        name
        article {
          title
          slug
        }
      }
    }
  }
}

请注意,article名称是您文章的contentTypeId。