GraphQL 中的分组查询(不是“分组依据”)

Posted

技术标签:

【中文标题】GraphQL 中的分组查询(不是“分组依据”)【英文标题】:Group queries in GraphQL (not "group by") 【发布时间】:2021-11-24 06:07:25 【问题描述】:

在我的应用程序中,GraphQL 公开了许多实体。所有实体都获得解析器,并且有很多方法(我认为它们在 GraphQl 中被称为“字段”)。由于只允许一种查询类型,我得到一个“无尽”的 fields 列表,它们属于许多不同的上下文,即:

query 
 newsRss (...)
 newsCurrent (...)
 userById(...)
 weatherCurrent (...)
 weatherForecast(...)
 # ... many more

如您所见,这里仍然有 3 个不同的上下文:新闻、用户和天气。现在我可以继续为所有字段添加前缀 ([contextName]FieldName),就像我在示例中所做的那样,但列表会越来越长。

如果它们与相同的上下文相关,有没有办法将它们“组合”在一起?像这样,在天气情况下:

query 
  weather 
     current(...)
     forecast(...)
  

提前致谢!

【问题讨论】:

如果我正确理解您的问题,可能您可以使用查询过滤器:例如:weather(contextType: ContextTypeEnum) if(contextType === 'Current') return currentWeather; ... 【参考方案1】:

如果你想将它们组合在一起,你需要有一个包含同一上下文下所有字段的类型。以天气为例,你需要有一个包含currentWeatherforecastWeather字段的类型。这个概念是否对您的应用程序有意义,以便您可以轻松命名它并且用户不会对此感到陌生?如果是,您可以更改架构以实现您的目的。

另一方面,如果同一上下文的所有字段实际上返回相同的类型但它们只是过滤不同的东西,您可以考虑在根查询字段中定义arguments来指定您要过滤的条件,类似:

query 
   weather(type:CURRENT)

query 
   weather(type:FORECAST)

分别查询当前天气和预报天气。

所以这是一个关于如何设计架构的问题。

【讨论】:

以上是关于GraphQL 中的分组查询(不是“分组依据”)的主要内容,如果未能解决你的问题,请参考以下文章

加入和分组依据 - 选择列表中的列无效

选取 SQL“分组依据”中的任何元素

哪个最快?计数子查询或分组依据

大查询不同和分组依据

实体框架 LINQ - 具有分组依据的子查询

查询不工作。也许“分组依据”有问题。怎么了?