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
字段返回的类型更改为 List
的 Authors
:
author: [Author]
【讨论】:
你是对的,实际上在猫鼬模式中设置为作者数组是一个错误 嗨!我有一个小问题:如果我也需要获取作者的 id 怎么办?以上是关于Graphql 结果不使用猫鼬填充关联类型的结果的主要内容,如果未能解决你的问题,请参考以下文章