有没有办法在 graphQL 中对查询进行分组?

Posted

技术标签:

【中文标题】有没有办法在 graphQL 中对查询进行分组?【英文标题】:is there a way to group queries in graphQL? 【发布时间】:2019-03-04 21:03:58 【问题描述】:

我正在尝试对 graphQL 查询进行分组,以获得更有条理的响应。

我想查询 allEmployees 并返回以下格式的内容

GraphQL 查询


    Employees:allEmployees
        id
        firstName
        lastName    
    

回应


    "data": 
        "Employees": [
            "new":[
                
                    "id": "1",
                    "firstName": "James",
                    "lastName": "Test"
                ,
                
                    "id": "3",
                    "firstName": "Charles",
                    "lastName": "Tes"
                
            ],
            "updated":[
                
                    "id": "4",
                    "lastName": "Test"
                ,
            ],
            "deleted":[
                
                    "id": "1",
                ,
            ],
        
    

我已经研究了一些选项来通过片段上的别名来命名子请求(比如新的、更新的和删除的),但这似乎不是一回事。我看过工会,但这似乎不是我想要的。

理想情况下,我想查询 graphql 之类的......


    Employees:
        new: allEmployees(status:"new")
            id
            firstName
            lastName    
        

        updated: allEmployees(status:"updated")
            id
            firstName
            lastName    
        

        deleted: allEmployees(status:"deleted")
            id
        

但我认为不可能传递这样的嵌套查询。

有没有办法做这样的事情?我通过 graphql-ruby gem 将 graphql 与 ruby​​ 一起使用。

如果有人需要更多信息,请告诉我?

谢谢


编辑

澄清一下。我们有多个实体将遵循新的、更新的、删除的模式。希望尝试在结果嵌套在父名称/别名(员工、用户)中的情况下获得响应


    "data": 
        "Employees": [
            "new":[...],
            "updated":[...],
            "deleted":[...],
        ],
        "Users": [
            "new":[...],
            "updated":[...],
            "deleted":[...],
        ],
         ...                   

这就是我们想要嵌套的原因

【问题讨论】:

只玩/graphiQL?只需将一个查询放在另一个查询下方 @xadm 感谢您的评论。我正在寻找使用标签对查询进行分组。如果您有时间,请参阅上面的编辑。 如果您需要为不同的实体执行此操作,您需要为每个实体定义一个Type。一旦你有了它,只需将你从数据库中查询的记录分组到你想要的相应标签中。 【参考方案1】:

GraphQL 绝对支持嵌套查询和多个***查询,graphql-ruby 支持这些就好了。

如果您的 GraphQL 架构如下所示:

type Employee 
  id: ID!
  firstName: String
  lastName: String

enum Status  NEW, UPDATED, DELETED 
type Query 
  allEmployees(status: Status): [Employee!]!

然后你可以写一个查询

fragment EmployeeData on Employee  id firstName lastName 
query Everyone 
  new: allEmployees(status: NEW)  ... EmployeeData 
  updated: allEmployees(status: UPDATED)  ... EmployeeData 
  deleted: allEmployees(status: DELETED)  ... EmployeeData 

这不会有您正在寻找的特定形式 - 没有很好的方法可以在查询中添加或删除任意级别,例如添加“员工”标签或从 React 样式的连接记录中删除层– 但它可以检索您要查找的数据。

【讨论】:

感谢@DavidMaze 的回复。我已经更新了问题以进一步解释我正在寻找的格式。根据您的回答,我认为不可能做我正在寻找的事情。我是否能够创建一种解析为我正在寻找的格式的类型,或者这会打破 graphql 约定? 您可以通过添加查询Employees: EmployeeStatuses,然后使用newupdateddeleted 字段创建一个类型,从而创建一个产生精确响应格式的类型结构。它少了一点……不过 GraphQLy,感觉就像重写你的 API 以符合特定客户的期望。

以上是关于有没有办法在 graphQL 中对查询进行分组?的主要内容,如果未能解决你的问题,请参考以下文章

有没有办法将 GraphQL 查询字段分组到子/嵌套查询组中?

有没有办法在 Git 中对提交进行分组?

有没有办法在 Google Cloud Platform 中对服务帐户进行分组?

有没有办法根据小数位在python中对数组/列表的值进行动态分组?

在 graylog、prometheus、grafana 等工具中对历史警报进行分组

有没有办法在 SQL 中对组执行操作?