如何在 GraphQL 中用键值对表示地图或对象?
Posted
技术标签:
【中文标题】如何在 GraphQL 中用键值对表示地图或对象?【英文标题】:How to represent a map or object with key-value pairs in GraphQL? 【发布时间】:2022-01-11 14:52:00 【问题描述】:如何查询以下对象?
result:
'1':
^^^ these are dynamic keys, never constant
id: 'id1',
,
'20':
id: 'id2',
,
'300':
id: 'id3',
,
我知道我可以相当简单地定义 result
对象,如果它不是键值对对象的话。
const ResultQueryType = new GraphQLObjectType(
name: 'ResultQueryType',
fields: () => (
id: type: GraphQLString
)
)
但这显然不是我需要的。我还没有遇到过 GraphQL 的这种情况,我该怎么办?
【问题讨论】:
【参考方案1】:您可以按照此处的建议尝试动态密钥。 https://graphql.org/graphql-js/type/#graphqlobjecttype
const ResultQueryType = new GraphQLObjectType(
name: "ResultQueryType",
fields: () => (
[fieldName: string]: type: GraphQLString ,
),
);
【讨论】:
【参考方案2】:您只能查询已在架构中明确定义的字段。
Spec: 字段选择的目标字段必须在选择集的作用域类型上定义。
Docs 每个 GraphQL 服务都定义了一组类型,这些类型完整地描述了您可以在该服务上查询的可能数据集。然后,当查询进入时,它们会根据该架构进行验证和执行。
换句话说,如果架构定义不知道其字段,则您不能拥有 Results
映射类型(因此无法查询它)。有几种解决方法:
-
使用 JSON。许多实现让您定义custom scalars as JSON 或
有一个
JSON
类型,它是一个 String
别名。您保留了地图结构但失去了类型意识。由客户端解析结果。
将地图重构为数组。如果可以将***键合并到每条记录中,则可以返回一个[Item]
数组。
您必须放弃地图,但要保持完整的 GraphQL 类型感知。
【讨论】:
以上是关于如何在 GraphQL 中用键值对表示地图或对象?的主要内容,如果未能解决你的问题,请参考以下文章
在Cassandra中用新的键值对更新地图类型列,而不是完全覆盖地图。
javascript JS中通过名单转地图类型或Json的对象实现键值对