我开始使用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中创建)。
答案 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架构中指定的字段匹配的键 类型定义,它将填充这些字段并忽略其他所有字段。
当然,如果你需要额外的控制(可能你的对象键和字段名称不匹配),你仍然可以自己编写解析器。