【发布时间】:2021-10-19 20:03:30
【问题描述】:
TLDR:如何解决嵌套 GraphQL 查询,其中 GQL 架构与存储在 MongoDB 数据库中的数据不同?
我们有一个应用程序,其中我们数据库中的每个用户都有一组外键,这些外键引用其他文档,在本例中为“宠物”。这些宠物在一个单独的集合中。
{
"humans": [
{
"id": "1",
"name": "bob",
"pets": [
"jBWMVGjm50l5LGwepDoty1",
"jBWMVGjm50l5LGwepDoty12"
]
}
]
}
我在这个数据库前面有一个 GraphQL API,我正在尝试编写我的解析器来处理嵌套查询。问题是我们的 GraphQL 模式与 DB 模式不匹配。在 Human 类型内部,pets 字段需要一个宠物数组,如下所示:
type Human {
id: ID!
name: String!
pets: [Pet!] # This is an array of pet objects...
gender: String!
hair: String!
favoriteNum: Int!
alive: Boolean!
createdAt: Int!
}
目前,人类解析器将通过他/她的 ID 查询人类,并返回该人类,如下所示:
human(parent, { input }, { models }) {
return models.Human.findOne({ id: input.id });
}
显然,这里的问题是从数据库返回的人不符合 GQL 模式。 “宠物”数组不是对象数组,而是 ID 数组。解决此类查询的正确方法是什么?
我们尝试在人类解析器inside 中为人类宠物添加另一个数据库调用。这里的问题是,如果有人只查询人类的名字,我们的解析器将不得不去获取所有的宠物数据,即使我们的用户没有请求它......
但是,如果我们的宠物有外键,同样的问题会再次出现!我们如何解决这个问题?
【问题讨论】:
标签: javascript mongodb graphql