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

Posted

技术标签:

【中文标题】如何在 graphql 查询中按文件扩展名过滤【英文标题】:How to filter by a file extension in a graphql query 【发布时间】:2019-09-10 10:37:24 【问题描述】:

我想查询存储库中 docs 文件夹中的 markdown 文件的内容。我正在使用gatsby-source-graphql 和GitHub 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,并且需要额外的工作才能过滤掉。

有没有办法在docs/ 目录中只查询带有md 扩展名的文件?

编辑:

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


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

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

【问题讨论】:

看来你解决了!您可以使用 repository(owner: "kalessil", name: "phpinspectionsea") ... on Repository ... 而不是使用 search 来改进您的存储库查询。 感谢您的洞察力。实际上,我仍然不知道该怎么做。仍然需要 GraphQL > JS > GraphQL 才能获得结果,这确实完成了任务。现在我只是好奇这是否可能。 不知道这是否可能,我遇到了类似的问题,我无法使用 GitHub GraphQL API 解决。而且从 *** 获得的帮助也很少,太新了。如果这里没有进一步的帮助,您可以尝试在GitHub community forums 上提问。我很想看看你的想法! 附带说明,可以删除... on GitHub_Repository 并在repository 查询之后直接使用object 【参考方案1】:

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


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

【讨论】:

以上是关于如何在 graphql 查询中按文件扩展名过滤的主要内容,如果未能解决你的问题,请参考以下文章

如何在我的 schema.graphql 文件中为按 id 过滤的查询引用生成的 Prisma 模式

在原生 Android 文件选择器中按 mime 类型或扩展名过滤

如何在 JSON 文件上运行的 GraphQL 上应用过滤器?

使用 apollo-express 限制或过滤 graphql 查询

Python:返回从列表中过滤的对象的 index() 列表

在 Gatsby 和 Contentful 中按日期过滤