从具有子字段的mongoose模式生成Graphql类型

时间:2017-07-09 01:47:45

标签: mongoose graphql graphql-js

我开始使用NodeJS和Mongoose构建一个Graphql服务与生产中的REST API一起使用,但是我在找到将我的mongoose模式转换为GraphQL类型的方法时遇到了一些麻烦。 / p>

我有以下架构:

history

所以,基本上,问题是history字段。此字段是一个包含2个子字段的对象列表:orders(引用另一个mongoose模式的Objects列表)和restaurant(引用餐馆的mongoose模式)。

我的主要问题是:为“User”编写相应的GraphQL类型时,有没有办法创建子字段,就像我在SELECT `pelamarmagisterrangkuman`.`major` AS `ProgramStudi`, count(IPKS1) as N, AVG(IPKS1) as Mean, MIN(IPKS1) as Minimum, MAX(IPKS1) as Maximum, StdDev(IPKS1) as StDev, CAST(SUBSTRING_INDEX(SUBSTRING_INDEX( GROUP_CONCAT(IPKS1 ORDER BY IPKS1 SEPARATOR ','), ',', 50/100 * COUNT(*) + 1), ',', -1) AS decimal) AS `Median`, CAST(SUBSTRING_INDEX(SUBSTRING_INDEX( GROUP_CONCAT(IPKS1 ORDER BY IPKS1 SEPARATOR ','), ',', 25/100 * COUNT(*) + 1), ',', -1) AS decimal) AS `Q1`, CAST(SUBSTRING_INDEX(SUBSTRING_INDEX( GROUP_CONCAT(IPKS1 ORDER BY IPKS1 SEPARATOR ','), ',', 75/100 * COUNT(*) + 1), ',', -1) AS decimal) AS `Q3` FROM `pelamarmagisterrangkuman` where `pelamarmagisterrangkuman`.`IPKS1` != 0 and `pelamarmagisterrangkuman`.`TahunDaftar` = 2012 group by `pelamarmagisterrangkuman`.`major` 字段上使用mongoose一样,或者我必须创建第二个Type和然后引用这种类型(知道应用程序不需要在mongoose中创建另一个模式,只能在GraphQL中创建)。

1 个答案:

答案 0 :(得分:1)

就像你说的那样,当你编写GraphQL架构时,历史记录需要是一个单独的类型,可能是Order和Restaurant。使用Apollo,模式类型定义类似于:

type User {
  # additional fields
  history: [Record!]!
}

type Record {
  orders: [Order!]!
  restaurant: Restaurant
}

除了上面的类型定义,您还可以为User提供解析器。在这种情况下,解析器只返回User.findOne()(或者您通常从数据库中获取User对象)。

以下是整洁的部分:您可能甚至不需要订购,餐厅甚至历史的解析器。当您没有指定解析器时,GraphQL将使用一个默认的解析器,它可以愉快地使用它传递的对象(无论您在解析器中为User类型传递的User对象的哪个块)。如果它在该对象中找到与您在GraphQL架构中指定的字段匹配的键 类型定义,它将填充这些字段并忽略其他所有字段。

当然,如果你需要额外的控制(可能你的对象键和字段名称不匹配),你仍然可以自己编写解析器。