GraphQL-何时使用具有递归和规范化数据的解析器或参数?
我正在处理一个非常大的规范化和递归对象。我想得到所有递归项的列表。我应该使用参数还是自定义解析器 我的对象看起来像:GraphQL-何时使用具有递归和规范化数据的解析器或参数?,graphql,Graphql,我正在处理一个非常大的规范化和递归对象。我想得到所有递归项的列表。我应该使用参数还是自定义解析器 我的对象看起来像: { 产品:[{ 产品编号:“汽车”, 包裹编号:5 },{ 产品编号:“门” 包裹编号:6 }, {产品id:“车轮”}, {产品id:“金属”}, {产品id:“玻璃”}], 捆绑包:[{ 包裹编号:5, 选项:[{产品id:“门”},{产品id:“轮子”}] }, { 包裹编号:6, 选项:[{产品id:“金属”},{产品id:“玻璃”}] }] } 您可能会注意到“car
{
产品:[{
产品编号:“汽车”,
包裹编号:5
},{
产品编号:“门”
包裹编号:6
},
{产品id:“车轮”},
{产品id:“金属”},
{产品id:“玻璃”}],
捆绑包:[{
包裹编号:5,
选项:[{产品id:“门”},{产品id:“轮子”}]
},
{
包裹编号:6,
选项:[{产品id:“金属”},{产品id:“玻璃”}]
}]
}
您可能会注意到“car”是一个捆绑包
,它有一个门
和一个轮子
。“门”也是一个束
,它有金属
和玻璃
。这种结构可能无限期地重复出现。也就是说,一个捆绑包下面可以有无限多的捆绑产品
我想获得一个捆绑包的所有产品的列表(例如:“汽车”)。最好的方法是什么
我看到两种选择
第一个选项-使用自定义解析器,例如将递归并解析为所有子级的平面数组的child\u products
:
products(product_id: "car") {
product_id
bundle {
options {
product_id
}
}
child_products {
product_id
bundle {
options {
product_id
}
}
}
}
products(product_id: "car", include_children: true) {
product_id
bundle {
options {
product_id
}
}
}
第二个选项-使用指定包含所有子项的参数:
products(product_id: "car") {
product_id
bundle {
options {
product_id
}
}
child_products {
product_id
bundle {
options {
product_id
}
}
}
}
products(product_id: "car", include_children: true) {
product_id
bundle {
options {
product_id
}
}
}
我将构建一个JS库,它可以获取产品和选项的数组,并构建嵌套结构。请让我知道你认为什么是正确的方法。谢谢 您不需要像
include_children
这样的参数,因为客户机的查询足以确定是否包含节点——如果客户机不需要节点,它可以省略相应的字段
基于提供的JSON对象,我希望模式如下所示:
type Query {
product(id: ID!): Product
}
type Product {
id: ID!
bundle: Bundle
}
type Bundle {
id: ID!
options: [Product!]!
}
这将允许您进行如下查询:
query {
product(id: "car") {
id
bundle {
options {
id
bundle {
id
# and so on...
}
}
}
}
}
此查询的实际深度将取决于客户的需要。递归类型定义像这样做可能会产生攻击向量,所以你也应该使用类似的库或.< /p>谢谢!大多数客户将需要获得完整的深度。但深度可能会因捆绑而变化。尽管如此,您仍然建议只要求一些“合理的最大”金额。。。深度是10?此外,产品及其子产品之间的关系并不像上述那样简单。选项值看起来更像一个选择器:
{type:“glass”,weight:{gt:5}}
,您是否会制作一个类似于product\u options
的解析器,然后使用这10个级别的深度?我想这里没有无限递归的空间,因为最终我们会命中一个没有捆绑包的产品,因此,您可能不必限制深度。但是,是的,您可能需要确定最大深度是什么样子,并基于此创建请求。在这种情况下,options
可以是其他中间类型,如BundleOption
,然后会有一个product
字段。