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
字段。