У меня есть две коллекции:
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
.Эту проблему можно было бы легко исправить, если бы я мог каким-то образом определить, какие поля запрашиваются в поле сообщений автора, а затем решить, будет ли достаточно значений, возвращаемых в parent.Если нет, то я мог бы продолжить поиск dbPosts со значением идентификатора автора.Является ли это возможным?Потому что в противном случае это лишило бы смысла денормализацию ваших коллекций, что Монго настоятельно рекомендует вам сделать!