GraphQL 和 MongoDB 中的多态数据结构

Posted

技术标签:

【中文标题】GraphQL 和 MongoDB 中的多态数据结构【英文标题】:Polymorphic datastructure in GraphQL with MongoDB 【发布时间】:2019-02-22 09:03:09 【问题描述】:

我需要在 GraphQL(MongoDB 作为数据库)中创建一个数据结构,它表示以下架构:

一个账单可以有多个文章 一篇 article 有一个 article-group-number 和许多属性,这些属性 100% 取决于 article-group-number,并且可能会有所不同这些群体之间的差距很大。

因此一篇文章可能如下所示:


article-group-number: 100,
length: 5.5

另一篇文章可能如下所示:


article-group-number: 101,
width: 2

甚至可能有文章引用了另一篇文章(但没有循环结构)。

我需要能够为每个文章编号创建和维护不同的验证规则(函数)。 我该怎么做?

我在考虑 GraphQL 中的 union 类型,但目前这些类型只能读取,不能写入(通过“突变”)。 我是否应该将这些 文章 保存为纯 JSON 数据并手动进行所有验证?这样我就会失去逻辑结构,因为这个 JSON 数据字段在我眼中只是某种“混乱的数据块”,因为通过 GraphQL 会丢失所有逻辑。

没有更干净的方法吗?

【问题讨论】:

【参考方案1】:

两种选择:

您可以从 GraphQL 本身中得到启发——模式中使用的 __Type 类型有一个“种类”字段,以及许多依赖于类型种类的属性。例如,一个对象类型可以有字段,但其他类型的类型不能。 GraphQL 只是将所有可能的属性放在 __Type 类型中,并在它们不适用于该类型的种类时让它们取空值。你可以做类似的事情,让你的文章拥有所有可能的属性。

或者您可以使用文章类型的联合,也许都实现一个通用的文章接口。对于突变来说,这并不是真正的问题。由于突变与查询在一个完全不同的命名空间中,它们可以做任何你想做的事——你改变的类型不必与你查询的类型相同,实际上通常不是。

两种方式都有效。不过,第二种方法更复杂,所以如果你要这样做,请确保你会从中获得某种好处。

【讨论】:

我不确定我是否理解您的第一种方式是否正确。你能提供任何文件或例子吗?因为我还没有找到。

以上是关于GraphQL 和 MongoDB 中的多态数据结构的主要内容,如果未能解决你的问题,请参考以下文章

Apollo graphql 正在为 mongodb 中的空子文档返回空数据

我们可以在 GraphQL 中编写 Mongodb 查询吗?

如何使用graphql将mongodb中多个集合中的数据传递到1个反应表

使用 graphql-compose-mongoose 将对象添加到 mongodb 模型中的对象数组

GraphQL集成Spring和MongoDB

使用 express 和 Mongodb 的 Graphql 查询将无法正常工作?