混叠是非常方便和工作时,混叠一个特定的解决方案。例如:
{
admins: users(type:"admin"){
username
}
moderators: users(type:"moderators"){
moderators
}
}不过,我不知道如何处理字段本身的混叠。例如:
{
site_stats {
hits: sum(field: "hits")
bounces: sum(field: "bounces")
}
}如果解析器返回任何sum值,则相同的值将别名为hits和bounces (这很有意义,因为甚至只能返回单个和值)。如果我使解析器在返回结果时使用别名作为字段名,则hits和bounces都成为null。
我可以简单地将这些字段分解成单独的解析器,但这会使前端开发人员的集成变得复杂。我们还将失去大量的效率效益,因为我可以将单个查询中所需的所有数据聚合到数据源(我们使用的是ElasticSearch)。
来自你们天才的任何帮助都将不胜感激!
发布于 2020-04-08 15:02:47
使用别名和单个字段的的可用性非常有限。
您可以使用复杂的过滤器(输入参数),f.e。要返回的密钥列表及其关联的params,f.e。
[{name:"hits", range:"month"},
{name:"bounces", range:"year"}]具有查询期望结构
{
stats {
name
sum
average
}
}所需字段可能会有所不同,f.e。只有name和sum。
可以返回对象f.e的数组。
{ stats: [
{ name:"hits",
sum:12345,
average: 456 }别名在这里可以用于选择不同的数据集f.e。name和sum为hits,bounces为average。
..。更具声明性?
PS。没有什么是“使前端开发人员的集成复杂化”的。结果为json,在需要时可在取(clinet端)后进行转换/转换/适应。
发布于 2020-04-07 23:08:24
听起来,您将所有的逻辑都放在根级解析器(site_stats)中,而不是为sum字段提供解析器。换句话说,如果您的解析器如下所示:
const resolvers = {
Query: {
site_stats: () => {
...
return { sum: someValue }
},
},
}相反,您应该这样做:
const resolvers = {
Query: {
site_stats: () => {
return {} // empty object
},
},
SiteStats: {
sum: () => {
...
return someValue
},
},
}这样,您就不会从父服务器传递sum的值并依赖于默认的解析器--而是在解析器中显式地为sum提供值。由于sum解析器将为每个别名分别调用该别名的参数,因此每个别名都将相应地进行解析。
https://stackoverflow.com/questions/61089875
复制相似问题