我有这样的架构类型:
type Instance {
id: ID!
parentSeries: ID
tags: JSON
}
标签字段是动态JSON类型(https://github.com/taion/graphql-type-json)。它也非常大。理想情况下,我可以在客户端上指定返回的标签中的哪些字段。 GraphQL / Apollo可以做到吗?如果没有,您会提出什么建议?
答案 0 :(得分:1)
您可以在字段上包含一个path
参数,然后使用lodash
的{{1}}之类的东西根据提供的路径来转换JSON项:
get
您可以通过这种方式应用任意数量的任意转换来定制返回的JSON对象。但是,由于您要返回标量,因此无法仅为字段提供选择集。
伙计们常常觉得他们需要使用JSON标量只是因为他们正在使用的数据是一张地图。但是,地图可以轻松转换为数组,而无需JSON标量就可以轻松地在您的模式中表示它。所以你可以打开它:
const resolvers = {
Instance: {
tags: (instance, args) => {
return _.get(instance.tags, args.path)
},
},
}
对此:
{
"foo": {
"propA": "A",
"propA": "B"
},
"bar": {
"propA": "A"
"propA": "B"
}
}
答案 1 :(得分:0)
您可以在tags
中添加参数,例如路径或其他某种过滤器:
type Instance {
id: ID!
parentSeries: ID
tags(path:String): JSON
}
然后在解析器中实现过滤器,例如@Daniel Rearden的答案
但是!为什么要使用巨大的json设计它??
通常,当事物很少且在编译时无法确定数据的“形状”时,我会使用JSON。或者仅仅是服务器不在乎数据内容,客户端将完成所有工作。
在您的情况下,JSON数据确实很大,所以我想将其分解为较小的类型会是一种更好的方法