3
respostas

Busca por autor retornando array vazia

Segue o trecho do código que estou usando para tratar a busca quando existe o parâmetro "nomeAutor":

if (nomeAutor){
      const autorAchado = await autor.findOne({nome: nomeAutor});
      const idAutor = autorAchado._id;
      console.log(idAutor);
      busca.autor = idAutor;
}

Eu adicionei o console.log para checar qual conteúdo está indo para o método livro.find() na sequência do código a cima, e estou recebendo o id no seguinte formato: new ObjectId("655b7bccf74bce4659af5d44").

Eu não sei se deveria receber dessa forma (incluindo a parte "new ObjectId") ou só a string com o hexadecimal, mas imagino que esteja correto pois não está dando CastError.

Minha suposição é que o problema esteja na forma como eu construí o modelo do livroSchema, que está diferente da forma usada no curso. Como eu estou fazendo esse curso na sequência desse outro, eu continuei usando o mesmo projeto, mesmo tendo notado que havia algumas diferenças em relação ao do curso atual. Por esse motivo, o campo 'autor' do meu livroSchema foi criado dessa forma:

autor: autorSchema

É realmente esse o motivo de o meu código não estar funcionando?

Se sim, eu preciso mudar o meu livroSchema para refletir o do projeto usado no curso, ou existe uma forma dessa busca (livro por autor) funcionar mantendo o meu livroSchema como está?

Se não, alguma sugestão de onde pode estar o problema para eu verificar e compartilhar os trechos de código necessários para que possam me auxiliar?

Obs: eu testei a requisição com todos os autores que tenho com livros cadastrados, copiando e colando os nomes para garantir que não houve erro de digitação, e chequei no console os IDs retornados e estão batendo com os cadastrados no DB. Em todos os casos eu recebo uma array vazia como retorno. As demais buscas (por editora, número de páginas e título) estão funcionando perfeitamente.

3 respostas

Olá, Vinícius! Tudo joia?

Como sugestão, para resolver esse problema, será necessário ajustar o seu livroSchema para refletir o modelo utilizado no projeto do curso. Dessa forma, você poderá realizar a busca por autor corretamente, utilizando o id do autor.

Você deve ajustar o campo autor do seu livroSchema para ficar da seguinte forma:

autor: {
  type: mongoose.Schema.Types.ObjectId,
  ref: 'autores', required: true
},

Dessa forma, o campo 'autor' será uma referência para o modelo 'autores' e você poderá realizar a busca por autor utilizando o id do autor.

No entanto, é importante ressaltar que essa é apenas uma sugestão com base no contexto fornecido. Se possível, compartilhe mais trechos de código ou todo o seu código para que eu possa te ajudar de forma mais precisa.

Espero ter ajudado e bons estudos!

Caso este post tenha lhe ajudado, por favor, marcar como solucionado ✓.

Muito obrigado pela resposta, Armano!

Eu alterei o campo 'autor' do livroSchema como você orientou, mas mesmo dessa forma a busca ainda retorna um array vazio. Eu revirei o código, fiz diversos testes, mas não consegui entender o que está acontecendo.

Aqui está o link do meu código (com o campo 'autor' do livroSchema já de volta à forma inicial). Se você conseguir dar uma olhada e descobrir o problema, eu fico muito grato.

Consegui resolver!

Lendo essa página do site do Mongoose eu descobri que quando passamos um Schema como parâmetro de um campo de um outro Schema, ele é tratado como um objeto único (no meu caso, as propriedades de 'autor' se comportam como 'subpropriedades' de 'livro'). Esse comportamento é diferente de quando um model é passado como referência ao campo (que é o caso usado no projeto do curso).

Então no meu projeto é possível acessar o nome do autor através de 'livro.autor.nome'. Sendo assim, tentei o seguinte código:

if (nomeAutor){
busca.autor = {};
busca.autor.nome = nomeAutor;

Ainda assim, a busca retornou um array vazio... Então continuei pesquisando e achei esse tópico no Stack Overflow, dizendo que a busca por uma propriedade aninhada precisa ser feita passando o caminho do campo buscado entre aspas no método find(). Sendo assim, tentei o código abaixo:

    if (nomeAutor) busca = { ...busca, "autor.nome": nomeAutor };

E, aí sim, finalmente funcionou!

Obrigado novamente pela ajuda, Armano! Hoje vou conseguir dormir tranquilo... Hahahah