用于同一 Mongoose 集合上的接口的 GraphQL 解析器

Posted

技术标签:

【中文标题】用于同一 Mongoose 集合上的接口的 GraphQL 解析器【英文标题】:GraphQL Resolver for Interface on same Mongoose collection 【发布时间】:2019-06-07 22:06:08 【问题描述】:

我正在创建一个使用 Mongoose 和 GraphQLInterfaceType 的 GraphQL 服务器。我有书籍的 GraphQLInterfaceType 和 SchoolBooksType 和 ColoringBookType 的子类型。在我的 Mongoose Schema 中,我指定 SchoolBooks 和 ColoringBooks 都将存储在同一个书籍集合中

const coloringSchema = new Schema(
  title: String,//Interface
  pages: String
);

module.exports = mongoose.model("ColoringBook", coloringSchema , "books");

const schoolSchema = new Schema(
  title: String, //Interface
  subject: String
);

module.exports = mongoose.model("SchoolBook", schoolSchema , "books");

这是我的一种类型

const SchoolBookType = new GraphQLObjectType(
  name: "SchoolBook",
  interfaces: [BooksInterface],
  isTypeOf: obj => obj instanceof SchoolBook,
  fields: () => (
    title:  type: GraphQLString ,
    subject:  type: GraphQLString 
  )
);

这是我的查询:但我不知道要返回什么,如果我需要将两个集合合并到同一个数组中?

books: 
      type: new GraphQLList(BooksInterface),
      resolve() 
        return SchoolBook.find()  //<---- What to return?
      
    

这是我的查询:


  books
title
    ... on ColoringBook
      pages

    

    ... on SchoolBook
      subject
    
  


任何帮助都会很棒,谢谢。

【问题讨论】:

【参考方案1】:

我猜你可以使用异步解析器,并连接两个查询。

resolve: async () => 
  const schoolBooks = SchoolBook.find().exec()
  const coloringBooks = ColoringBook.find().exec()

  const [sbooks, cbooks] = await Promise.all([schoolBooks, coloringBooks])
  return [...sbooks, ...cbooks]

【讨论】:

以上是关于用于同一 Mongoose 集合上的接口的 GraphQL 解析器的主要内容,如果未能解决你的问题,请参考以下文章

MongoDB/Mongoose:对同一集合中不同类型的文档使用不同的方案

模型与架构上的 Node.js 和 mongoose module.exports

如何使用另一个集合 mongoose 查找子查询文档

如何在一个获取请求中返回多个 Mongoose 集合?

防止同时访问 Mongoose 中的文档

16集合--Map接口