Eu alterei um pouco o código do livro.js para ele aceitar a propriedade editora como um Schema, conforme imagem abaixo: Mas como faço para buscar agora pela editora agora que eu não tenho simplesmente o nome da editora?
Eu alterei um pouco o código do livro.js para ele aceitar a propriedade editora como um Schema, conforme imagem abaixo: Mas como faço para buscar agora pela editora agora que eu não tenho simplesmente o nome da editora?
Olá, Yuri! Tudo bem?
Para buscar livros por editora no MongoDB, quando a editora é um objeto ou um Schema separado, você precisa usar uma abordagem ligeiramente diferente. Você pode usar o método populate
do Mongoose, que permite que você referencie documentos em outras coleções.
Assumindo que você tem um modelo Editora
e que o bookSchema
está referenciando esse modelo em sua propriedade editora
, você pode fazer algo assim no seu controlador:
static async listarLivrosPorEditora(req, res) {
const nomeEditora = req.query.editora; // Captura o nome da editora passado como query parameter
try {
// Primeiro, encontra a editora pelo nome
const editora = await Editora.findOne({ nome: nomeEditora });
// Se a editora não existir, retorna um erro
if (!editora) {
return res.status(404).json({ message: 'Editora não encontrada' });
}
// Depois, busca os livros que têm essa editora, usando populate para preencher os dados da editora
const livros = await Livro.find({ editora: editora._id }).populate('editora');
res.status(200).json(livros);
} catch (erro) {
res.status(500).json({ message: `${erro.message} - falha na busca.` });
}
}
Neste código, primeiro buscamos a editora pelo nome. Isso assume que você tem um modelo Editora
e que a editora é buscada pelo campo nome
. Depois, usamos o ID da editora encontrada para buscar os livros associados a essa editora. O método populate('editora')
é usado para incluir os detalhes da editora nos resultados dos livros, assumindo que editora
é uma referência no seu bookSchema
.
Certifique-se de que os modelos e as referências estão corretamente configurados para que isso funcione. Também é importante tratar o caso em que a editora não é encontrada para evitar erros de execução.
Espero ter ajudado e bons estudos!
Muito obrigado! Funcionou perfeitamente! Mas tenho algumas observações e gostaria de saber o motivo delas:
Na linha const livros = await Livro.find({ editora: editora._id }).populate('editora');
percebi que o "_id" faz com que o método não funcione. Então deixei somente await Livro.find({ editora: editora })
. Nem o .populate('editora')
precisei colocar, parece que ele não faz diferença.