问题描述
我正在想办法使用 MongoDB 创建一个 GraphQL API,并且我正在尝试了解接口。
我明白了它背后的想法,并观看了大量关于演讲和操作方法的视频,但我看到的一件事是如何制作查询解析器。
总是这样显示:groups: () => { ... }
groups
将列在查询类型中,因此它需要 mongodb 查询。
这是我需要找到答案的解析器:
{...}
的内部是什么?
Query: {
groups: () => { ... },families: () => Family.find(),members: () => Member.find(),},
我认为我在查询时遇到的问题是:“由于 groups
不是 mongodb 文档,查询会是什么?”
更多信息:
这里是完整的 typedef
export const typeDefs = gql`
interface Group {
id: ID!
name: String!
}
type Family implements Group {
id: ID!
name: String! # persons family name
numberOfPeople: Int
}
type Member implements Group {
id: ID!
name: String! # persons first name
age: Int!
}
type Query {
groups: [Group]
families: [Family]
members: [Member]
}
}
这里是解析器
export const resolvers = {
Group: {
__resolveType(group,context,info){
if(group.family){
return 'Family';
}
if(group.member){
return 'Member';
}
return null;
},Query: {
groups: () => { ... },}
}
这个想法是,Family
和 Member
是保存数据的单独文档,而 Group
是创建组合它们的查询的接口。
解决方法
对于任何遇到这个问题的人 - 这是我必须放入 Query{ ... }
实际上是执行数据库查询的函数。
Groups
表示复数返回,
Group
用于单数返回
groups: async () => {
let types = mongoose.modelNames()
let total = []
for(let t of types) {
let temp = await mongoose.model(t).find()
total.push(temp)
}
let flat = total.flat()
return flat
},group: (_,{ id }) => {
return mongoose.modelNames().map(async mn => {
if (await mongoose.model(mn).exists({"_id": ObjectID(id)})) {
return mongoose.model(mn).findOne({"_id": ObjectID(id)})
}
})
},