1
resposta

[Dúvida] Possível inconsistência encontrada no código. .find() para armazenar a query e .find() novamente para executá-la.

O professor ensina como criar uma query com:

const buscaLivros = livros.find();
req.resultado = buscaLivros;

E dps ele faz:

const resultado = req.resultado;
const livrosResultado = await resultado.find()

Porém, acredito que tenha uma inconsistência ou código desnecessário, pois 'resultado' já armazena a query. Sendo assim, não seria necessário executar .find() novamente em 'const livrosResultado = await resultado.find()'. Apenas 'await resultado' ja seria suficiente.

Além disso, pensando em legibilidade e clareza no código, acredito que 'resultado' não seja um bom nome para armazenar a query, pois pode causar confusão posteriormente. Uma vez que oq está nesse campo não é o resultado em si, mas sim a query.

1 resposta

Olá, Ygor. Como vai?

Sua observação é muito perspicaz e demonstra que você está atento ao funcionamento interno das Queries do Mongoose. Você tem razão em ambos os pontos levantados, tanto na parte técnica quanto na semântica do código.

No Mongoose, quando executamos o método livros.find(), ele não retorna imediatamente o resultado da busca, mas sim um objeto do tipo Query. Esse objeto é uma promessa (thenable) que só será executada no banco de dados quando utilizarmos o await ou o método .exec(). Portanto, tecnicamente, se req.resultado já guarda o retorno de livros.find(), fazer await resultado é perfeitamente funcional e o segundo .find() acaba sendo redundante.

Sobre a nomenclatura, você está coberto de razão. No desenvolvimento de software, a legibilidade é fundamental. Chamar uma Query de resultado antes de ela ter sido executada pode induzir outros desenvolvedores ao erro, fazendo-os pensar que já possuem os dados em mãos, quando na verdade possuem apenas o "comando" para buscar esses dados.

Aqui estão alguns pontos para complementar sua reflexão:

  • O uso do segundo .find() no curso pode ter sido uma forma de o instrutor garantir que, independentemente do que viesse no objeto, ele estivesse tratando uma busca, mas no contexto do Mongoose, isso é desnecessário se a query já foi iniciada.
  • Uma nomenclatura mais assertiva para req.resultado seria algo como req.queryObjeto ou req.busca.
  • Chamar o método sem o await no início é uma técnica poderosa para compor a busca (adicionando .sort(), .limit() ou .skip()) antes de finalmente enviá-la ao MongoDB.

Um exemplo de como o código ficaria mais semântico:

// No middleware de busca
const busca = livros.find(parametros);
req.queryLivros = busca;

// No middleware de paginação
const queryLivros = req.queryLivros;
const livrosEncontrados = await queryLivros.exec();

Note que o uso do .exec() é uma boa prática recomendada pela documentação do Mongoose para obter stack traces mais claros em caso de erro, em vez de usar apenas o await direto na query.

Espero que possa ter lhe ajudado!