首页 > 解决方案 > 如何在 graphql 查询中按文件扩展名过滤

问题描述

我想查询存储库中 docs 文件夹内的降价文件的内容。我正在使用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
              }
            }
          }
        }
      }
    }
  }
}

也许有更好的方法?

编辑2:

我已经根据@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的正确方法;对于将来遇到此问题的任何人,请查看他们的示例项目。

现在我只是好奇是否可以将所有这些操作合二为一。

标签: gitgithubgraphqlgatsby

解决方案


跟进我的评论:如果您想查询特定文件的内容(例如在您的示例中),您可以使用这个更简洁的查询:

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

推荐阅读