如何在 graphQL 中编写 JOIN 或从多种类型中获取结果 - AWS App sync iOS

Posted

技术标签:

【中文标题】如何在 graphQL 中编写 JOIN 或从多种类型中获取结果 - AWS App sync iOS【英文标题】:How to write JOIN in graphQL or get result from multiple types - AWS App sync iOS 【发布时间】:2019-05-29 05:07:37 【问题描述】:

我将 AWS AppSync 用于我的一个应用程序中的聊天应用程序。我们能够成功地进行设置和基本查询。

在一种情况下,我需要编写一个自定义的 GraphQL 查询,以便我可以使用来自另一种类型的引用来获取其他数据。例如,我可以有来自用户的allMessageGroup 和来自特定组的allMessages

现在我想添加组中的最后一条消息及其发件人以及所有消息组的列表,就像什么是应用主页一样。

但我无法理解如何进行 JOIN 或编写这样的查询,这些查询会根据对话/消息/用户类型/表给出混合结果。

平台:ios 语言:斯威夫特

以下是我正在使用的架构和 API/查询的详细信息

架构

type Conversation 
  conversation_cover_pic: String
  conversation_type: String!
  createdAt: String
  id: ID!
  messages(after: String, first: Int): MessageConnection
  name: String!
  privacy: String

type Message 
  author: User
  content: String!
  conversationId: ID!
  createdAt: String
  id: ID!
  recipient: User
  sender: String

type MessageConnection 
  messages: [Message]
  nextToken: String

查询

query getUserConversationConnectionThroughUser($after: String, $first: Int)

    me
    
        id
        __typename
        conversations(first: $first, after: $after)
        
            __typename
            nextToken
            userConversations
            
                __typename
                userId
                conversationId
                associated
                
                    __typename
                    userId
                
                conversation
                
                    __typename
                    id
                    name
                    privacy
                    messages
                    
                        __typename
                        id
                        conversationId
                        content
                        createdAt
                        sender
                        isSent
                    
                
            
        
    

【问题讨论】:

我想帮忙,但这几乎是难以理解的。您是说要从查询中返回的不仅仅是me?联接不是由 GraphQL 处理的,这可以由解析器处理。 我想得到比我更多的结果,它可以基于条件,例如获取所有聊天组的列表,还可以在组中添加最后一条消息,其中包含组详细信息,可在对话/组所有下使用消息列表 你能展示你的解析器吗? Graphql 只是一种定义边界和类型的方法。它没有说明如何查询或存储数据。 你明白了吗?我面临同样的问题,我可以在 iOS 查询中检索对象 me,然后检索所有 userConversations,但我无法通过 userConversations 查找所有实际对话。 【参考方案1】:

听起来您需要对一个或多个数据源的多个请求来完成此 graphQL 查询。在这种情况下,您可以使用 AppSync 的 管道解析器 功能。

使用管道解析器,您可以创建多个函数,每个函数都可以使用前一个函数的结果并查询数据库。这些函数按照您指定的顺序运行。

您可以使用管道解析器执行的操作示例:

    一个函数将查询聊天组数据库 第二个函数将使用聊天组的结果来获取消息 将所有结果整合到一个包含组信息和消息的 graphQL 响应中

这是管道解析器的文档: https://docs.aws.amazon.com/appsync/latest/devguide/pipeline-resolvers.html

【讨论】:

不需要使用管道解析器,此查询在appsync聊天应用程序中用作示例,它也没有使用管道解析器。 Example 查询多个数据源的另一种方法是设置嵌套解析器。这是聊天应用程序使用的方法。 感谢您的回复。这是有道理的,如果我要从聊天应用程序中快速复制相同的查询,那该怎么做呢?这是我面临的问题,here。 您添加 1) 查询本身的解析器,2) 查询返回类型的子字段的解析器。在您的示例中,“我”查询中有一个解析器。 “我”查询返回“用户”类型,并且“用户”类型的字段上有多个解析器。因此,当您运行“me”查询时,“me”解析器将首先运行,然后“User.conversations”解析器将第二个运行,输入来自“me”解析器。以下是该示例中使用的解析器:Resolvers 我完全理解,但是当我使用 amplify for swift 生成代码时,它不知何故不会为associated: [UserConversations] 生成字段。因此,即使我的解析器的设置与聊天应用程序完全相同,但在 UserConversations 类型上,首先没有要访问的子字段。 Here 是我所指的 swift 的代码生成器。如您所见,无法通过 UserConversations 与 Me 关联。

以上是关于如何在 graphQL 中编写 JOIN 或从多种类型中获取结果 - AWS App sync iOS的主要内容,如果未能解决你的问题,请参考以下文章

GraphQL 如何做一个 JOIN 请求而不是许多顺序请求?

如何指定采用多种类型的 graphql 类型?

通过 AWS AppSync GraphQL API 使用多种授权类型

如何在 apollo graphql 服务器中编写解析 graphql 过滤器

如何在 python 函数中编写 graphQL 突变?

graphql 无法将 100 多种产品添加到我的 Wordpress Woocommerce 商店