graphql - 将多个查询的结果合并到一个数组中

chr*_*ian 3 graphql graphql-js

我正在使用 graphQL 通过组合查询在多个 mongoDB 集合和 API 之间执行搜索。所有查询都返回结果类型

{
  _id: string; 
  name: string; 
  type: string;
}
Run Code Online (Sandbox Code Playgroud)

有没有办法将数据展平成单个数组?

组合查询示例:

query searchAll {
    books(input: {text: "e"}) {
        _id
        name
        type
    }
    magazines(input: {text: "e"}) {
        _id
        name
        type
    }
}
Run Code Online (Sandbox Code Playgroud)

响应目前看起来像:

{"data": {
        "books": [
            {
                "_id": "5a8ac759c25b7235ffdc6888",
                "name": "someBook",
                "type": "book"
            }
        ],
        "magazines": [
            {
                "_id": "5a87005bc25b7235ffdc4bdf",
                "name": "someMagazine-1",
                "type": "magazine"
            },
            {
                "_id": "5a870067c25b7235ffdc4be4",
                "name": "someMagazine-2",
                "type": "client"
            }
        ]
    }
}
Run Code Online (Sandbox Code Playgroud)

期望的回应:

{"data": {
    "results": [
            {
                "_id": "5a8ac759c25b7235ffdc6888",
                "name": "someBook",
                "type": "book"
            },
            {
                "_id": "5a87005bc25b7235ffdc4bdf",
                "name": "someMagazine-1",
                "type": "magazine"
            },
            {
                "_id": "5a870067c25b7235ffdc4be4",
                "name": "someMagazine-2",
                "type": "client"
            }
        ]
    }
}
Run Code Online (Sandbox Code Playgroud)

And*_*ram 6

您想研究使用接口,这是一个(稍微丰富的)模式定义的示例:

interface Searchable {
  id: ID!
  name: String!
}

type Book implements Searchable {
  id: ID!
  name: String!
  author: Author!
  publisher: Publisher!
  isbn: String!
}

type Magazine implements Searchable {
  id: ID!
  name: String!
  publisher: Publisher!
  issn: String!
}

input SearchInput {
  text: String!
}

type Query {
  search(input: SearchInput!): [Searchable!]!
}
Run Code Online (Sandbox Code Playgroud)

以下是您查询它的方式:

query searchAll {
  search(input: {text: "e"}) {
    __typename
    id
    name
    ... on Book {
      author
      isbn
    }
    ... on Magazine {
      issn
    }
  }
}
Run Code Online (Sandbox Code Playgroud)

解析器search将负责调用所有不同的集合并将结果聚合到单个数组中。比这更深入的是实现特定的,但是应该有文档用于在您使用的任何 GraphQL 实现中使用接口(和联合,它们是相似的)。

__typename字段告诉您返回对象的具体类型,从而让前端代码执行适当的显示逻辑。