使用 MongoDB 时的 Graphql 接口

问题描述

我正在想办法使用 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: () => { ... },}
}

这个想法是,FamilyMember 是保存数据的单独文档,而 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)})
        } 

    })

},