Graphql 结果不使用猫鼬填充关联类型的结果

Posted

技术标签:

【中文标题】Graphql 结果不使用猫鼬填充关联类型的结果【英文标题】:Graphql result does not populate result in associated Type using mongoose 【发布时间】:2019-06-15 15:02:58 【问题描述】:

我尝试使用 ObjectId 引用在 Mongoose 中创建模式,并能够使用 Apollo Server 通过 GraphQL 查询它们

我已经像这样在猫鼬中定义了一个非常基本的 Book 和 Author ObjectId ref

const  ObjectId  = mongoose.Schema.Types;
const AuthorSchema = new mongoose.Schema(
  name: String
);

const BookSchema = new mongoose.Schema(
  name: String,
  author: [ type: ObjectId, ref: 'Author' ]
);

并且拥有像这样的 graphql 架构

  type Author 
    id: ID!
    name: String
  

  type Book 
    id: ID!
    name: String
    author: Author
  

  type Query 
    authors: [Author]
    author(id: ID!): Author
    books: [Book]
    book(id: ID!): Book
  

  input AddAuthorInput 
    name: String!
  

  input AddBookInput 
    name: String!
    author: ID!
  

  type Mutation 
    addAuthor(input: AddAuthorInput): Author
    addBook(input: AddBookInput): Book
  

addBook 和 book 查询的解析器中的变异部分是这样的

    addBook: async (_, args) => 
      try 
        const 
          input
         = args;
        return Book.create(input);
       catch (e) 
        return e.message
      
    

      book: async (_, args) => 
        const  id  = args;
        const result = await Book.findById(id).populate('author').exec();

        console.warn('====== Book query result ======');
        console.log(JSON.stringify(result, null, 2));
        console.warn('====== End Book query result ======');

        return result;

当我用这个查询时

query book 
  book(id: "xxxxxxx") 
    id
    name
    author 
      name
    
  

我在 author.name 中得到 null,而我可以从控制台输出中看到 .populate() 能够从 Authors 集合中获得正确的结果。

这个repo 包含我创建的示例代码

【问题讨论】:

你的问题拯救了我的一天 【参考方案1】:

您的 mongoose 架构设置为每本书返回多个作者:

author: [ type: ObjectId, ref: 'Author' ]

如果它应该只是一个作者,那么就这样做:

author:  type: ObjectId, ref: 'Author' 

您不能返回 GraphQL 期望单个对象的数组,反之亦然。如果您想保持 mongoose 架构相同,则需要将 author 字段返回的类型更改为 ListAuthors

author: [Author]

【讨论】:

你是对的,实际上在猫鼬模式中设置为作者数组是一个错误 嗨!我有一个小问题:如果我也需要获取作者的 id 怎么办?

以上是关于Graphql 结果不使用猫鼬填充关联类型的结果的主要内容,如果未能解决你的问题,请参考以下文章

通过在猫鼬中填充匹配结果来查找文档

从带有子字段的猫鼬模式生成 Graphql 类型

另一个突变的 GraphQL 结果

与填充一起使用时,猫鼬查询性能低下

GraphQL:返回具有不可为空 id 字段的类型作为查询结果

如何仅在猫鼬中使用聚合填充嵌套在对象数组中的字段?