在这里使用GraphQL中的Union类型进行试验时:https://graphql.github.io/learn/schema/#union-types我遇到了以下情况:
我最初认为您在查询中指定的字段是将要搜索文本的字段:“ Millenium”,但是事实并非如此,因为即使删除名称后,我仍然可以获取Millenium Falcon的数据查询Startship
类型的字段。
我进行了另一项测试:R2-D2的primaryFunction
是Astromech
,即使您搜索Astromech
,即使为{{ 1}}类型。
答案 0 :(得分:0)
请注意,在“星际飞船”上仍要指定名称,因为如果“星际飞船”不是角色,则结果中不会显示该名称!
这只是意味着,因为我们使用的是Union类型,给定属于Union的两个类型都具有一个name
字段,因此您仍然必须为每种类型请求name
字段在他们的内联片段中。省略name
片段的Starship
,但将其包含在Character
上,则意味着如果返回的类型是Character
,则名称字段将存在但不存在Starship
类型。
文档中提到这一点是为了突出联盟与接口之间的区别。 如果SearchResult是一个包含name
字段的接口,并且Character
和Starship
实现了该接口,则可以执行以下操作:
{
search(text: "an") {
name
__typename
... on Human {
height
}
... on Droid {
primaryFunction
}
... on Starship {
length
}
}
}
但是,由于联盟不保证其类型之间共享任何字段,因此使用联盟是不可能的。
关于搜索,这不是GraphQL的特性。该特定模式恰好在其search
类型上具有一个Query
字段,并且该字段解析了特定的方式。如果要创建服务器,则可以编写一个搜索字段,该字段将请求的字段视为搜索条件的一部分。但这是一个实现细节,与GraphQL的总体工作方式无关。