GraphQL如何将子属性owner.login移至父层级与name同级?
如何在GraphQL查询中拉平嵌套字段层级
嘿,这个需求我太懂了!我之前用GitHub GraphQL API的时候也纠结过这个问题——默认情况下GraphQL严格按照你写的查询结构返回数据,所以嵌套的字段肯定会保持嵌套层级,但咱们有两种办法能实现你想要的效果:
1. 客户端侧处理(最直接可行)
因为GitHub的Repository类型并没有直接提供顶层的ownerLogin字段,所以最简单的方式就是拿到返回结果后,在客户端自己重组数据结构。
首先,先写一个简洁的查询(不用太复杂的别名,先拿到需要的原始数据):
query { organization(login: "facebook") { repositories(first: 5) { edges { node { name owner { login } } } } } }
然后用你熟悉的语言处理数据,比如JavaScript里可以这么做:
// 假设你已经拿到了API返回的response对象 const rawRepos = response.data.organization.repositories.edges; // 拉平字段层级 const flattenedRepos = rawRepos.map(edge => { const { name, owner } = edge.node; return { name, owner_login: owner.login // 把login字段提到和name同一层级 // 如果不需要保留原始的owner对象,就不用加进去 }; });
这样处理后,你得到的每个仓库对象就是{ name: "react-native", owner_login: "facebook" }这种结构,完全符合你的需求。
2. 确认API是否支持顶层字段(可选)
你可以去查一下GitHub GraphQL API的文档,看看Repository类型有没有直接提供类似ownerLogin的顶层字段——如果有的话,直接在查询里请求这个字段就行,不用嵌套。不过我印象里目前GitHub API并没有这个字段,所以还是第一种办法更靠谱。
为什么不能直接在查询里拉平?
GraphQL的核心原则是**“请求什么结构,就返回什么结构”**,服务器不会自动帮你重组字段的层级关系。除非API的 schema 里定义了顶层的字段,否则你没办法只通过查询语句把嵌套字段拉到顶层。
内容的提问来源于stack exchange,提问作者Nuno Gonçalves
相关产品推荐
相关产品推荐

