用于处理混合类型的GraphQL架构

用于处理混合类型的GraphQL架构,graphql,graphql-js,Graphql,Graphql Js,我最近开始研究使用GraphQL请求动态数据配置的可能性。我首先想到的是GraphQL的强类型概念 GraphQL模式是否有办法处理混合类型对象的数组?如果您能给我一个解释,或者可能给我一个参考资料,我将不胜感激 我目前正在使用带有Node.js的GraphQL,但稍后的实现将来自Java容器。所有数据都将从MongoDB中提取JSON。我认为可以创建一个符合需要的自定义/泛型类型。 这样,它仍然是一个强类型数组,但类型将足够灵活,可以设置您需要的内容 下面是一个自定义类型的示例: 您要么让这些

我最近开始研究使用GraphQL请求动态数据配置的可能性。我首先想到的是GraphQL的强类型概念

GraphQL模式是否有办法处理混合类型对象的数组?如果您能给我一个解释,或者可能给我一个参考资料,我将不胜感激


我目前正在使用带有Node.js的GraphQL,但稍后的实现将来自Java容器。所有数据都将从MongoDB中提取JSON。

我认为可以创建一个符合需要的自定义/泛型类型。 这样,它仍然是一个强类型数组,但类型将足够灵活,可以设置您需要的内容

下面是一个自定义类型的示例:

您要么让这些不同的类型实现相同的接口,要么让您的解析器返回联合,要么创建一个自定义标量来保存动态数据

最干净的方法是第一种:如果生成的对象的类型数量有限,请定义类型以便它们实现相同的接口,并根据接口键入解析器。这允许客户端根据实际类型有条件地选择子字段,并且您可以维护类型安全性

第二种方法也有类似的局限性:您需要提前知道可能的类型,但它们不必实现相同的接口。当可能的值彼此不相关并且具有/或语义(如成功/失败)时,更可取


自定义标量方法是唯一一种不需要知道结果可能类型的方法,即结果的结构可以是完全动态的。这种方法称为JSON标量(即,将任何JSON可序列化结构填充到标量值中)。这种方法的一大缺点是,它使子选择变得不可能,因为整个值变成一个大标量(即使它是一个复杂的对象)。

如果数据完全是JSON,而您更愿意保留它们,请查看。基本上

import { GraphQLObjectType } from 'graphql';
import GraphQLJSON from 'graphql-type-json';

export default new GraphQLObjectType({
  name: 'MyType',
  fields: {
    myField: { type: GraphQLJSON },
  },
});

这不是他想要的。他询问您是否可以在同一json数组中进行查询以返回多个类型。假设您想显示一个日程安排,包括“事件”和朋友的生日,您想将它们作为单独的对象处理,因为它们有不同的数据,应该以不同的方式显示,但按日期排序。GraphQL为此提供了接口和联合。我认为我没有资格写一个正确的答案,但是你可以在文档中找到它:因此,如果我阅读了文档,并希望正确理解你的答案:似乎不可能实现一个带有混合结果有序列表的类型化模式。示例:混合搜索。union是一种“非此即彼”的返回类型,因此不能使用它,因为您希望按相关性顺序返回混合结果。接口方法似乎不成问题,因为生成的类型是异构的。我是否认为JSON标量是唯一的选项?如果是这样的话,我更愿意回到JSON-API…@Overcryd这与GraphQL几乎没有任何关系。在任何类型化语言中,如果没有一致的接口,或者没有最通用类型的列表(例如Java中的
list
),那么就不能有一个混合类型的列表。如果你的客户不知道结果会是什么形状,他们是如何消费的?你不太可能真的有这种情况。如果你真的这么做了,GraphQL也帮不了你。但是搜索结果都至少有一个标题和一个URL作为公共字段,不是吗?这可能只是文档编写的方式。我现在进一步挖掘,使用联合类型,我可以解决我的问题。虽然,仅仅通过阅读文档,我不会猜到,联合类型是一条可行的道路。如何将过滤器与混合数据类型集成?