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

时间:2018-02-19 14:02:36

标签: graphql graphql-js

我正在使用graphQL通过组合查询来跨多个mongoDB集合和API执行搜索。所有查询都返回

的结果类型
{
  _id: string; 
  name: string; 
  type: string;
}

有没有办法将数据压缩成单个数组?

综合查询示例:

query searchAll {
    books(input: {text: "e"}) {
        _id
        name
        type
    }
    magazines(input: {text: "e"}) {
        _id
        name
        type
    }
}

目前响应如下:

{"data": {
        "books": [
            {
                "_id": "5a8ac759c25b7235ffdc6888",
                "name": "someBook",
                "type": "book"
            }
        ],
        "magazines": [
            {
                "_id": "5a87005bc25b7235ffdc4bdf",
                "name": "someMagazine-1",
                "type": "magazine"
            },
            {
                "_id": "5a870067c25b7235ffdc4be4",
                "name": "someMagazine-2",
                "type": "client"
            }
        ]
    }
}

期望的回复:

{"data": {
    "results": [
            {
                "_id": "5a8ac759c25b7235ffdc6888",
                "name": "someBook",
                "type": "book"
            },
            {
                "_id": "5a87005bc25b7235ffdc4bdf",
                "name": "someMagazine-1",
                "type": "magazine"
            },
            {
                "_id": "5a870067c25b7235ffdc4be4",
                "name": "someMagazine-2",
                "type": "client"
            }
        ]
    }
}

1 个答案:

答案 0 :(得分:3)

您希望了解如何使用接口,这是一个(略微更丰富)架构定义的示例:

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!]!
}

以下是您查询它的方式:

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

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

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