‫Instrutor: Então, esta é a
‫segunda parte do cálculo das estatísticas de revisão.
‫Desta vez, para quando um comentário for atualizado ou excluído.
‫E essa parte é um pouco
‫mais difícil porque, lembre-se de
‫que uma revisão é atualizada
‫ou excluída
‫usando findByIdAndUpdate ou também findByIdAndDelete, certo?
‫Portanto, para eles, na verdade não temos middleware de documento,
‫mas apenas middleware de consulta, tudo bem.
‫E assim, na consulta, não temos
‫acesso direto ao documento para fazer algo semelhante
‫a isso, ok.
‫Porque, lembre-se, precisamos acessar a revisão atual, para que
‫de lá possamos extrair o ID do
‫tour e então calcular as estatísticas a partir daí, certo, mas
‫novamente, para esses ganchos aqui,
‫temos apenas o middleware de consulta, ok.
‫Mas deixe-me mostrar um
‫bom truque para realmente contornar essa limitação.
‫Então, vamos implementar um
‫pré-middleware para esses ganchos, basicamente para esses eventos.
‫Vou usar uma expressão regular para
‫uma string começando com
‫findOneAnd e pronto.
‫E então
‫este vai funcionar para findOneAndUpdate e findOneAndDelete
‫porque, lembre-se de que,
‫nos bastidores, findByIdAndUpdate é apenas uma
‫abreviação para findOneAndUpdate com o ID atual, certo.
‫Portanto, aqui, na verdade, precisamos usar
‫os ganchos de middleware findOneAndDelete e findOneAndUpdate.
‫Então, função, e ele obtém a próxima palavra-chave
‫porque é pré-middleware.
‫Portanto, lembre-se que o objetivo é obter acesso
‫ao documento de revisão atual, ok,
‫mas aqui o, esta palavra-chave é a consulta atual.
‫Agora, como vamos resolver isso?
‫Bem, podemos basicamente executar uma consulta e isso
‫nos dará o documento que está
‫sendo processado no momento.
‫Portanto, para fazer isso, podemos usar findOne.
‫E é isso.
‫Então, tudo o que precisamos fazer é aguardar essa consulta e
‫salvá-la em algum lugar.
‫Então, vamos chamá-lo de r, que será revisado, certo.
‫Em seguida, salve-o como assíncrono.
‫E é isso.
‫E só para ter certeza de que
‫isso funciona aqui, vamos por enquanto apenas registrar isso no console, ok.
‫Portanto, sem fazer cálculos, tudo o
‫que realmente nos
‫interessa é ver se esse truque bacana funciona.
‫Então, basicamente, o truque de contornar isso em
‫um midddleware de consulta,
‫só temos acesso à consulta.
‫Portanto, novamente, precisamos obter acesso ao
‫documento e, portanto, basicamente executamos essa consulta
‫usando findOne.
‫Tudo bem, então vamos atualizar uma revisão, e então vamos atualizar
‫o último que fizemos, tudo bem, e a
‫classificação, agora
‫vamos definir como quatro.
‫Antes eram cinco
‫e agora estamos mudando para quatro.
‫Então
‫foi enviado, e aqui está a revisão.
‫Agora, é claro, a classificação ainda está
‫definida como cinco neste ponto, porque este findOne aqui
‫realmente obtém o documento do banco de dados
‫e, portanto, neste ponto do tempo, no pré,
‫ainda não persistiu nenhuma alteração no banco de dados,
‫e então eram cinco
‫antes, e agora ainda serão cinco.
‫Mas isso realmente não
‫importa aqui, porque tudo o que nos interessa é este ID.
‫Na verdade, esse tour ID, certo, porque
‫é o que
‫vamos precisar para calcular as avaliações médias.
‫Ok, e agora, vamos realmente usar essa função.
‫Ok, agora vamos pensar sobre
‫isso porque se fôssemos usar essa função calcA
‫takingRatings neste
‫momento, então calcularíamos as
‫estatísticas usando os dados não atualizados, ok.
‫E então esse é exatamente o mesmo motivo pelo
‫qual aqui em cima também precisávamos usar post e não
‫pre, tudo bem, porque só depois que o documento já
‫está salvo no banco de
‫dados faz sentido então calcular as avaliações.
‫E aqui é exatamente a mesma coisa,
‫com a grande diferença que não podemos simplesmente mudar
‫esse pré para post.
‫Então não podemos fazer isso porque neste momento não
‫temos mais acesso à consulta porque a
‫consulta já foi executada, certo, e assim, sem a
‫consulta, não
‫podemos salvar o documento de revisão
‫e, então, não podemos executar esta função.
‫Então, isso é realmente confuso, eu entendo, mas eu realmente
‫decidi criar esta palestra desta forma porque, bem,
‫é realmente a única
‫solução para este problema e é um
‫ótimo exercício para você entender basicamente esta experiência Hello.
‫Então, a solução para isso agora é usar post,
‫então, reviewSchema, basicamente o mesmo, então vamos,
‫na verdade, vamos apenas copiar tudo isso, tornar nossas
‫vidas um pouco mais fáceis, nos livrar disso
‫e nos livrar do Next.
‫Aqui, também precisamos ligar em
‫seguida, ok, mas então faremos isso postar, ok.
‫E agora, neste
‫momento, depois que a consulta já
‫foi concluída e, portanto, a revisão foi atualizada,
‫este é um momento perfeito
‫em que podemos chamar essa função.
‫Portanto, calcule as classificações médias.
‫Mas de onde agora tiramos o ID do tour?
‫Bem, vamos ter que usar
‫um truque que é basicamente passar dados do pré-middleware
‫para o pós-middleware.
‫E então, em vez de salvar este documento em uma
‫variável simples, vamos salvá-lo aqui. r.
‫Então, basicamente, criamos uma propriedade nesta variável.
‫Ok, e agora aqui, ainda temos acesso a isso.
‫E agora, podemos dizer isso. r, que lembre-se é a revisão,
‫e então. Tour.
‫Então, isso é novamente muito confuso, mas também muito
‫divertido, uma vez que você entenda como isso
‫realmente funciona, ok.
‫Agora, novamente, precisamos de algo assim aqui para
‫realmente chamar essa função aqui, porque lembre-se
‫de que, na verdade,
‫é um método estático e, portanto, precisamos chamá-lo no modelo.
‫Agora, onde está esse modelo neste caso?
‫Bem, é isso. r, que é neste caso,
‫equivalente a
‫este aqui neste middleware ,. construtor. calcA AverageRatings.
‫Uau, isso parece bastante opressor, não é?
‫Claro, temos que esperar por isso, é por isso que declaramos
‫isso como assíncrono, ok.
‫Então, novamente, basicamente usamos essa maneira de passar os
‫dados do pré-middleware para o pós-middleware e,
‫então, aqui recuperamos o
‫documento de revisão desta variável.
‫Ok, e novamente, tivemos que fazer dessa forma
‫porque neste momento aqui, a consulta já foi executada e,
‫portanto, não
‫poderíamos fazer isso aqui.
‫E vamos realmente escrever isso;
‫NÃO funciona aqui, a consulta já foi executada.
‫Ótimo, e com isso, devemos realmente
‫estar prontos para testar isso.
‫Então, vamos atualizar este aqui mais
‫uma vez, e defini-lo para uma classificação de um, tudo bem.
‫Vamos agora dar uma olhada aqui, até ver que o número de
‫avaliações ainda é cinco, mas
‫a média agora é de apenas três, e
‫agora a questão é se isso realmente
‫atualizou também no tour e, sim,
‫realmente .
‫Portanto, cinco avaliações com uma média de três.
‫Ótimo, agora vamos atualizar outro.
‫Então, para isso, vamos pegar todas as nossas
‫avaliações, e na verdade não queremos
‫todas, apenas a última.
‫E aqui eu ainda
‫tenho esse filtro, então devo me
‫livrar dele, então
‫teremos todos os 65 resultados, todas essas análises, mas queremos apenas as
‫últimas, aquelas que acabamos de criar.
‫Então vamos atualizar ...
‫Não tenho certeza, porque na verdade eles não estão em ordem aqui.
‫Vamos, ok, então aqui temos os mais recentes.
‫Então, deixe-me atualizar este aqui, digamos, quatro, apenas como
‫um teste final, e isso deve aumentar
‫um pouco a média.
‫E de fato aconteceu.
‫Portanto, 3. 6 agora, e é claro, o número ainda
‫é cinco porque você não adicionou uma nova avaliação.
‫Por isso, funciona muito bem na atualização, vamos
‫agora também testá-lo com exclusão.
‫Então, vamos excluir a revisão
‫que acabamos de atualizar e agora devemos estar com
‫apenas quatro e, de fato, aqui estamos.
‫Então agora, apenas quatro.
‫E vamos excluir todos eles.
‫Então, este é o próximo.
‫Ah, aqui estamos.
‫Então também este.
‫Portanto, agora devemos
‫reduzir para três apenas ou, na
‫verdade, só temos dois restantes com uma média de quatro.
‫Então, vamos ver qual ainda nos resta.
‫Então é este com três e este com cinco.
‫E é por isso que temos essa média de quatro.
‫Então vamos nos livrar deste e agora nossa
‫média deve ser cinco, certo?
‫Ou, na verdade, três, porque o único que resta
‫tem três.
‫E agora o teste final, deletando o último,
‫só para ver o que vai acontecer depois que fizermos isso.
‫E, obtemos um erro aqui.
‫Portanto, não é possível ler a propriedade nRating de undefined.
‫Então, isso é calcA AverageRatings na linha número 69.
‫Então, não sei o que é isso.
‫Então, linha 69, e então, é esse problema aqui.
‫Então, estamos tentando ler nRating de undefined.
‫Portanto, a estatística zero é basicamente indefinida.
‫E isso porque, se não houver nenhum documento
‫correspondendo a essa consulta aqui, basicamente, bem, então
‫simplesmente obtemos um array vazio.
‫E isso é exatamente o que temos aqui.
‫Portanto, esta é a matriz de estatísticas e, no
‫momento, não tem nenhum resultado,
‫certo, só devemos executar esse trecho de código aqui sempre
‫que realmente tivermos algo na matriz de estatísticas.
‫Então vamos fazer isso.
‫Então, se estatísticas. comprimento é
‫maior que zero, bem, então faça isso.
‫E se não, bem, basicamente isso significa
‫que todas as nossas análises sumiram, então
‫basicamente queremos voltar ao padrão.
‫Então, vamos defini-lo para a quantidade
‫de zero e a média de 4. 5, que lembre-se, é o padrão quando não
‫há revisões.
‫Então, vamos criar rapidamente uma nova revisão, e
‫pode ser isso, tudo bem, então
‫estamos de
‫volta a ter uma classificação e agora excluí-la imediatamente, apenas
‫para testar aquele
‫trecho de código que acabamos de escrever, apenas para vê-lo aqui também,
‫então uma classificação, em média cinco.
‫E agora, quando o excluímos,
‫não recebemos mais um erro.
‫E em nosso tour, estamos de
‫volta ao zero e um padrão de 4. 5
‫Tudo bem, tudo bem, tudo bem, perfeito.
‫Então, vamos usar novamente um breve
‫segundo para recapitular o que acabamos de fazer.
‫Portanto, para poder executar essa função
‫aqui também na atualização e na exclusão, na verdade
‫precisamos usar o middleware de consulta que
‫o Mongoose nos fornece para essas situações.
‫Ok, então, não temos um middleware
‫de documento útil, que funcione, para essas funções, mas em
‫vez disso precisamos
‫usar o middleware de consulta e, nesse,
‫não temos acesso direto ao documento atual.
‫E então precisamos
‫contornar isso usando este findOne
‫aqui, e basicamente recuperando o documento atual do banco de dados.
‫Em seguida, armazenamos na variável
‫de consulta atual e, ao fazer isso, obtemos
‫acesso a ele no middleware pós.
‫E é apenas no pós-middleware que realmente calculamos as
‫estatísticas para as revisões.
‫E lembre-se de que fazemos isso dessa maneira porque, se
‫fizéssemos certo nesta função
‫de middleware, os dados subjacentes não teriam
‫sido atualizados naquele ponto e, portanto,
‫as estatísticas calculadas não estariam realmente atualizadas.
‫E é por isso que usamos esse processo
‫de duas etapas aqui basicamente.
‫Agora, vamos nos livrar deste console. logar aqui, já que terminamos agora, e
‫também dessas estatísticas.
‫Portanto, espero que tenha sido divertido para
‫você e não muito opressor.
‫Projetei este exercício especificamente para que pudéssemos resolver
‫um problema de negócios do mundo real
‫usando todas as ferramentas que o Mongoose nos oferece.
‫E assim, com isso, espero que você tenha aprendido
‫um pouco melhor como trabalhar com todos esses
‫diferentes middlewares em diferentes situações sempre que necessário
‫em uma situação do mundo real.
‫Então, ótimo trabalho por terminar esta
‫palestra bastante desafiadora e por ainda estar comigo neste ponto do curso.
‫É muito bom para mim ver, então estou muito
‫feliz com isso.
‫Mas, de qualquer forma, ainda há mais conteúdo
‫excelente surgindo nesta seção, então vamos prosseguir juntos, direto
‫para o próximo vídeo.