No meu projeto, mantive o author como um subdocumento dentro de books. Com isso, consegui filtrar normalmente usando a sintaxe do Mongoose.
Implementei filtros por publisher, title e também pelo nome do autor, usando regex para deixar a busca case-insensitive. Para acessar o campo do subdocumento, utilizei a notação em ponto (author.name), que funcionou sem problemas.
static async listBooksByFilter(req, res, next) {
const { publisher, title, authorName } = await req.query;
const regex = new RegExp(title, "i");
try {
const search = {};
if (publisher) search.publisher = publisher;
if (title) search.title = regex;
const findedBooks = await book.find({
...search,
"author.name": { $regex: authorName, $options: "i" },
});
await res.status(200).json({ book: findedBooks });
} catch (err) {
await next(err);
}
}
Achei interessante em compartilhar essa solução.