带有动态字段的 GraphQL 查询
GraphQL query, with dynamic fields
我有这样的架构类型:
type Instance {
id: ID!
parentSeries: ID
tags: JSON
}
标签字段是动态 JSON 类型 (https://github.com/taion/graphql-type-json)。它也非常大。理想情况下,在客户端,我可以使用标签 I return 指定哪些字段。 GraphQL/Apollo 这可能吗?如果没有,您有什么建议?
您可以在字段中包含一个 path
参数,然后使用 lodash
的 get
之类的东西根据提供的路径转换 JSON 项目:
const resolvers = {
Instance: {
tags: (instance, args) => {
return _.get(instance.tags, args.path)
},
},
}
您可以通过这种方式应用任意数量的任意转换来自定义返回的 JSON 对象。但是,由于您返回的是标量,因此无法只为该字段提供一个选择集。
人们经常觉得他们 需要 使用 JSON 标量只是因为他们正在使用的数据是地图。但是,地图可以轻松转换为数组,无需 JSON 标量即可轻松在您的架构中表示。所以你可以把这个:
{
"foo": {
"propA": "A",
"propA": "B"
},
"bar": {
"propA": "A"
"propA": "B"
}
}
进入这个:
[
{
"tagName": "foo",
"propA": "A",
"propA": "B"
},
{
"tagName": "bar",
"propA": "A",
"propA": "B"
}
]
您可以在 tags
中添加参数,如路径或其他类型的过滤器:
type Instance {
id: ID!
parentSeries: ID
tags(path:String): JSON
}
然后像@Daniel Rearden 的回答一样在解析器中实现过滤器
然而!为什么要设计这么大json???
通常我用JSON当只有少量的东西并且"shape"的数据在编译时无法确定。或者只是服务器不关心数据的内容,客户端将完成所有工作。
在你的情况下,JSON 数据确实很大,那么我想将其分解为更小的类型会是更好的方法
我有这样的架构类型:
type Instance {
id: ID!
parentSeries: ID
tags: JSON
}
标签字段是动态 JSON 类型 (https://github.com/taion/graphql-type-json)。它也非常大。理想情况下,在客户端,我可以使用标签 I return 指定哪些字段。 GraphQL/Apollo 这可能吗?如果没有,您有什么建议?
您可以在字段中包含一个 path
参数,然后使用 lodash
的 get
之类的东西根据提供的路径转换 JSON 项目:
const resolvers = {
Instance: {
tags: (instance, args) => {
return _.get(instance.tags, args.path)
},
},
}
您可以通过这种方式应用任意数量的任意转换来自定义返回的 JSON 对象。但是,由于您返回的是标量,因此无法只为该字段提供一个选择集。
人们经常觉得他们 需要 使用 JSON 标量只是因为他们正在使用的数据是地图。但是,地图可以轻松转换为数组,无需 JSON 标量即可轻松在您的架构中表示。所以你可以把这个:
{
"foo": {
"propA": "A",
"propA": "B"
},
"bar": {
"propA": "A"
"propA": "B"
}
}
进入这个:
[
{
"tagName": "foo",
"propA": "A",
"propA": "B"
},
{
"tagName": "bar",
"propA": "A",
"propA": "B"
}
]
您可以在 tags
中添加参数,如路径或其他类型的过滤器:
type Instance {
id: ID!
parentSeries: ID
tags(path:String): JSON
}
然后像@Daniel Rearden 的回答一样在解析器中实现过滤器
然而!为什么要设计这么大json???
通常我用JSON当只有少量的东西并且"shape"的数据在编译时无法确定。或者只是服务器不关心数据的内容,客户端将完成所有工作。
在你的情况下,JSON 数据确实很大,那么我想将其分解为更小的类型会是更好的方法