有没有办法使用 graphql 订阅将数据与聚合一起获取?

Posted

技术标签:

【中文标题】有没有办法使用 graphql 订阅将数据与聚合一起获取?【英文标题】:Is there a way to get data together with aggregations using graphql subscribtions? 【发布时间】:2021-12-12 20:20:02 【问题描述】: 我有一个社交网络类型的网络应用程序,其中包括 react-apollo-client 的 graphql(我的 graphql 服务器是 Hasura 实例)。 我的应用程序中有通知功能,我查询通知详细信息以及计数聚合,以在显示之前向用户显示他有多少通知。

最近我在我的应用程序中添加了 Web 套接字,并将通知查询重构为订阅。它工作得很好 - 当新通知插入数据库时​​,订阅会立即被调用。 我的问题是计数聚合。 当我运行以下订阅时:

const GET_NOTIFICATIONS = gql`
subscription($userId: Number!) 
  notifications(where:  user_id:  _eq: $userId  ) 
    creation_time
    description
  
  notifications_aggregations (where:  user_id:  _eq: $userId  ) 
    aggregate 
      count
    

`

我收到以下错误 - "type":"subscription_data","id":4,"payload":"errors":["message":"Subscription \"A\" must select only one top level field.","locations":["line":7,"column":3]]

经过快速研究,我仍然找不到任何解决问题的方法。 有没有办法让我在订阅中保留计数聚合?还是我需要在订阅调用后自己计算通知数量? 感谢您的每一个回复。

【问题讨论】:

【参考方案1】:

如错误所述,订阅只允许有一个***选择。要解决此问题,您只需将其拆分为两个单独的订阅即可。

无论如何,在应用程序上下文中提高通知计数可能更有意义,这样您就可以在应用标题中显示通知的总数。如果您这样做,我建议您可以将实际检索通知的操作部分转换回query,并且仅在用户实际尝试查看通知时调用它以节省开销。

【讨论】:

这意味着对 graphql 引擎的 2 个请求,而不是 1 个,这是我试图避免的。您不认为按原样获取通知并按数组长度计算计数更好吗?

以上是关于有没有办法使用 graphql 订阅将数据与聚合一起获取?的主要内容,如果未能解决你的问题,请参考以下文章

有没有办法将数据从页面 graphql 调用传递到组件 graphql 调用?

有没有办法使用 'unload\navigator.sendBeacon' + 'GraphQL' 将数据发送到服务器?

如何使用 Flutter 消费 GraphQL 订阅?

通过 GAE 标准上的 Websockets 订阅 GraphQL 没有响应

GraphQL/Prisma 订阅仅针对 DELETE 触发

有没有办法将 Java 服务器中的 GraphQL 查询转换为 SPARQL 查询?