我有两个收藏夹:
dbPosts
id: mongoose.Schema.Types.ObjectId,
title: { type: String },
content: { type: String },
excerpt: { type: String },
slug: { type: String },
author: {
id: { type: String },
fname: { type: String },
lname: { type: String },
}
dbAuthors
id: mongoose.Schema.Types.ObjectId,
fname: { type: String },
lname: { type: String },
posts: [
id: { type: String },
title: { type: String }
]
我按以下方式解决我的作者查询:
Query: {
authors: (parent, root, args, context) => {
return dbAuthor.find({});
},
author: (root, args, context) => {
return dbAuthor.findById(args.id);
},
},
Author: {
posts: (parent) => {
if(parent.posts) {
return parent.posts;
} else {
return dbAuthor.find({'author.id': parent.id});
}
},
}
我要解决的原因是通过规范化我的关系来优化我的MongoDB请求。这是目标:
如果仅需要列出具有其作品标题的作者,则所有必需的字段都在dbAuthors中,因此无需查找dbPosts。但是,如果您需要返回的每条帖子的更多详细信息,例如节选或,请在dbPosts中查找以下情况:
{'author.id': parent.id}
但是问题是,如果您的查询如下所示:
authors(id: "3") {
fname
lname
posts {
title
excerpt
}
}
它中断了,因为父对象中没有返回excerpt
字段。如果可以通过某种方式确定正在作者字段中查询哪些字段,然后确定在父级中返回的值是否足够,则可以轻松解决此问题。如果不是,那么我可以继续使用作者的id值查找dbPosts。可能吗?因为否则,Mongo会强烈敦促您这样做,这将破坏使收藏集不规范化的整个目的!