如何通过GitHub GraphQL API获取热门仓库中评论数超过阈值的Issue?
你没漏掉什么关键功能——GitHub GraphQL API目前确实不支持在查询阶段直接过滤评论数超过特定阈值的Issue,不管是通过仓库搜索还是Issue的filterBy参数都做不到这一点。下面具体说下原因和可行的解决办法:
为什么当前方式无法实现?
- 仓库搜索的局限性:你用的
search(type: REPOSITORY)查询只能基于仓库本身的属性过滤(比如stars、fork状态、推送时间等),没有任何参数能关联到仓库内Issue的评论数,也没法直接排除没有Issue的仓库。 - Issue filterBy的限制:Issue的
filterBy参数确实不支持按评论数过滤,官方提供的过滤选项只有状态、创建/更新时间、作者、经办人这些维度,完全没有涉及评论数量的条件。
可行的解决方案
目前最稳妥的方式就是先通过API获取符合条件的仓库及对应Issue,再在本地做筛选。不过可以通过一些优化减少不必要的请求和数据处理:
1. 先排除无Issue的仓库
在查询仓库时先获取issues.totalCount,如果这个值为0,直接跳过该仓库,不用再请求具体的Issue列表:
search(query: "stars:>10000 fork:false pushed:>2020-01-01 is:public mirror:false archived:false", type: REPOSITORY) { repositoryCount nodes { ... on Repository { nameWithOwner # 先获取仓库Issue总数,提前排除空仓库 issues { totalCount } # 按评论数倒序排列,优先获取评论多的Issue issues(first: 100, orderBy: {field: COMMENTS, direction: DESC}) { edges { node { title comments { totalCount } id number } } pageInfo { endCursor hasNextPage } } } } }
2. 本地筛选高评论数Issue
拿到Issue列表后,在客户端逻辑里过滤出comments.totalCount > 100的条目即可。另外,因为first:100最多返回100个Issue,如果仓库有更多Issue,需要利用pageInfo里的endCursor和hasNextPage进行分页请求,直到拿到所有符合条件的Issue或者遍历完所有Issue。
3. 备选:尝试GitHub REST API
如果GraphQL的方式太繁琐,也可以试试GitHub REST API的Issue搜索功能——它支持用comments:>100这样的查询参数直接过滤Issue评论数。不过要结合仓库的stars条件,你可能需要先获取符合stars要求的仓库列表,再逐个构造repo:owner/repo comments:>100的搜索请求,本质上和GraphQL的思路类似,但REST的搜索语法可能更直观一些。
总结
目前GitHub的API不管是GraphQL还是REST,都没办法一步到位直接筛选出“热门仓库中评论数>100的Issue”,必须分两步:先获取符合条件的仓库,再拉取Issue并本地过滤。你之前的思路是对的,没有忽略任何关键功能~
内容的提问来源于stack exchange,提问作者Jura Gorohovsky




