如何在 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的对象实现键值对

JS基础三

在Neo4j中,我们如何使用graphql将生成查询后获得的键值对存储到另一个现有节点?

React 中的数组与键值对(映射/对象)

225 对象与类 之 对象