如何在graphql查询中按文件扩展名过滤

时间:2019-04-20 13:29:49

标签: git github graphql gatsby

我想查询存储库中docs文件夹内的markdown文件的内容。我正在使用gatsby-source-graphqlGitHub v4 API

到目前为止,我已经设法通过以下代码获取文件内容:

{
  github {
    search(first: 1, type: REPOSITORY, query: "repo:kalessil/phpinspectionsea") {
      edges {
        node {
          ... on GitHub_Repository {
            folder: object(expression: "master:docs/") {
              ... on GitHub_Tree {
                entries {
                  oid
                  object {
                    ... on GitHub_Blob {
                      text
                    }
                  }
                  name
                }
              }
            }
          }
        }
      }
    }
  }
}

问题在于,任何类型的文件都可能最终位于目录内,例如txt,并且需要进行额外的工作才能过滤掉。

是否有一种方法只能查询md目录中扩展名为docs/的文件?

编辑:

可以分三个步骤完成。首先通过查询所有文件,过滤然后查询单个文件:

{
  github {
    files: search(first: 1, type: REPOSITORY, query: "repo:kalessil/phpinspectionsea") {
      edges {
        node {
          ... on GitHub_Repository {
            object(expression: "master:docs/") {
              ... on GitHub_Tree {
                entries {
                  name
                }
              }
            }
          }
        }
      }
    }
    content: search(first: 1, type: REPOSITORY, query: "repo:kalessil/phpinspectionsea") {
      edges {
        node {
          ... on GitHub_Repository {
            object(expression: "master:docs/DEVELOPERS.md") {
              ... on GitHub_Blob {
                text
              }
            }
          }
        }
      }
    }
  }
}

也许有更好的方法?

EDIT2:

我已经根据@robinmentral重构代码了(谢谢):

{
  github {
    files: repository(owner: "kalessil", name: "phpinspectionsea") {
      ... on GitHub_Repository {
        object(expression: "master:docs/") {
          ... on GitHub_Tree {
            entries {
              name
            }
          }
        }
      }
    }
    content: repository(owner: "kalessil", name: "phpinspectionsea") {
      ... on GitHub_Repository {
        object(expression: "master:docs/DEVELOPERS.md") {
          ... on GitHub_Blob {
            text
          }
        }
      }
    }
  }
}

但是它仍然需要在JavaScript方面进行过滤。因为我需要首先获取所有名称,所以请按扩展名过滤并仅直接查询那些文件。

这实际上是在gatsby-source-graphql中进行操作的正确方法;对于以后遇到此问题的任何人,请查看他们的示例项目。

现在我很好奇,是否有可能将所有这些操作组合在一起。

1 个答案:

答案 0 :(得分:0)

紧跟着我的comment:如果您要查询特定文件的内容(例如您的示例),则可以使用以下更简洁的查询:

{
  repository(owner: "kalessil", name: "phpinspectionsea") {
    ... on Github_Repository {
      object(expression: "master:docs/DEVELOPERS.md") {
        ... on Github_Blob {
          text
        }
      }
    }
  }
}