我试图使用ObjectId引用在Mongoose中创建架构,并能够使用Apollo Server通过GraphQL查询它们
我已经用猫鼬定义了一个非常基本的Book和Author ObjectId引用
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和书籍查询的突变部分是这样的
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 中为空,同时从控制台输出中可以看到.populate()能够从Authors集合中获取正确的结果。
此repo包含我创建的示例代码
答案 0 :(得分:0)
您的猫鼬模式已设置为每本书返回多位作者:
author: [{ type: ObjectId, ref: 'Author' }]
如果应该只有一位作者,那就去做吧
author: { type: ObjectId, ref: 'Author' }
您不能在GraphQL需要单个对象的情况下返回数组,反之亦然。如果要保持猫鼬模式不变,则需要将author
字段返回的类型更改为List
的{{1}}:
Authors