‫Narrador: Bem-vindo de volta.
‫Neste vídeo e no
‫próximo, quero apresentar a você
‫o pipeline de agregação MongoDB, que é uma estrutura
‫MongoDB extremamente poderosa e útil para agregação
‫de dados.
‫E a ideia
‫é que basicamente definamos um pipeline por
‫onde passam todos os documentos
‫de uma determinada coleção, onde
‫são processados passo a passo para transformá-los em resultados agregados.
‫Por exemplo, podemos usar o pipeline de
‫agregação para calcular médias ou calcular valores
‫mínimos e máximos ou podemos calcular distâncias
‫até, e podemos realmente fazer todos
‫os tipos de coisas.
‫É realmente incrível como esse pipeline
‫de agregação é poderoso.
‫Tudo bem, mas chega de conversa.
‫Agora vamos começar a usar o pipeline de agregação
‫e vou criar uma nova função de cabeçalho aqui,
‫porque mais tarde definiremos uma nova rota e
‫usaremos essa função para isso.
‫Mas essa nova rota, vou criá-la mais tarde.
‫Então, eu quero criar uma
‫função aqui que irá calcular algumas estatísticas sobre nossos passeios.
‫Vou chamá-lo de getTourStats.
‫Ok, então Stats for statistics, e
‫vai ser uma
‫função assíncrona e um código vs agora automaticamente pré-preenchido com isso.
‫Tudo bem, vamos criar ou tentar pegar o bloco aqui.
‫Na verdade, vou copiar isso daqui para
‫cima e agora vou criar uma
‫variável chamada estatísticas.
‫Agora, o pipeline de agregação é realmente um recurso do MongoDB.
‫Mas o Mongoose, é claro, nos dá
‫acesso a ele, para que possamos usá-lo no driver do Mongoose, certo?
‫Então, usando nosso modelo de tour
‫para acessar a coleção de tours,
‫dizemos tour. agregar.
‫E assim, o pipeline de agregação é
‫um pouco como uma consulta regular e, portanto, usar o
‫pipeline de agregação é um pouco como fazer uma consulta regular.
‫A diferença aqui é que nas agregações,
‫como já mencionei, podemos manipular os dados em
‫algumas etapas diferentes e,
‫portanto, vamos agora definir essas etapas.
‫E, para isso, passamos por uma série de chamados estágios.
‫Então, passamos em uma matriz e
‫aqui teremos vários estágios.
‫E novamente os documentos passam por esses estágios um
‫por um, passo a passo na sequência de definição
‫conforme a definimos aqui.
‫Portanto, cada um dos elementos neste
‫array será um dos estágios.
‫E há uma tonelada de diferentes
‫estágios que podemos escolher, mas direi apenas
‫os mais comuns nesta palestra
‫e também na próxima.
‫De qualquer forma, agora quero
‫dar uma olhada rápida na documentação do MongoDB
‫porque acho que ainda não fizemos isso.
‫Então MongoDB e já conhecemos este site.
‫Então, em nosso site do MongoDB, vamos aqui
‫para aprender, depois documentação e aqui
‫selecionamos o Manual do MongoDB e esta documentação é enorme.
‫Ele realmente tem um monte de coisas aqui
‫e se você fosse passar por
‫tudo isso, bem, então você se tornaria um mestre do MongoDB.
‫Portanto, é uma boa introdução ao MongoDB, você
‫tem a instalação aqui.
‫Você tem as Operações CRUD, então uma boa visão
‫geral sobre muitas
‫das coisas que já aprendemos antes, certo?
‫Então você tem coisas sobre a
‫agregação e, em particular, o pipeline de
‫agregação sobre o qual
‫falaremos agora, mas o que eu realmente
‫quero mostrar aqui é essa referência que temos na parte
‫inferior porque na referência temos aqui para
‫exemplo os operadores e é aí
‫que temos muitas coisas importantes que usamos o tempo todo.
‫Então, vamos dar uma olhada
‫aqui nos operadores de consulta, por exemplo, e aqui você vê, nós
‫realmente temos esses operadores que já usamos.
‫Por exemplo, maior ou igual, ou menor e
‫igual, mas se algum dia em
‫seus próprios aplicativos você precisar de alguma
‫outra operadora, bem, agora você sabe onde pode encontrá-los.
‫Agora, é claro, também é sempre muito
‫útil apenas fazer uma pesquisa rápida no Google,
‫provavelmente encontrar alguma postagem sobre estouro de pilha sobre
‫isso, mas acredite, muitas vezes
‫é mais fácil e rápido pular rapidamente para a documentação e pesquisar
‫rapidamente o que quer que você ' está precisando.
‫Você só precisa saber como
‫funciona a documentação e, sabendo disso, será
‫bem fácil encontrar o que está procurando, certo?
‫Aqui você também tem alguns
‫operadores lógicos, por exemplo, o operador OR que já usamos.
‫Novamente, muitas coisas realmente, operadores geoespaciais e vamos usar algumas,
‫na verdade, mais tarde, e
‫sim, muitas coisas realmente.
‫Então, o que eu queria mostrar a vocês após esta palestra, na
‫verdade, são os estágios do pipeline de agregação.
‫Então aqui você tem muitos deles
‫e o que vamos usar nesta palestra
‫aqui é a correspondência, por exemplo e grupo,
‫onde está isso?
‫Sim grupo, esse é muito importante, e como
‫mencionei, vou mostrar a
‫vocês os mais importantes nesta palestra e na próxima.
‫Mas, novamente, se você em algum caso precisar de algo mais,
‫então vá em frente, venha aqui para esta documentação
‫e você encontrará o que está procurando.
‫Tudo bem?
‫De qualquer forma, vamos aprender como podemos realmente
‫definir um desses estágios, certo?
‫E vou começar com fósforo.
‫E a correspondência consiste basicamente
‫em selecionar ou filtrar determinados documentos.
‫E é muito simples.
‫É realmente como um objeto de filtro no
‫MongoDB, como temos usado tantas vezes.
‫Portanto, cada um dos estágios é
‫um objeto e aí vem o nome do estágio.
‫Então esta é a fase de jogo, certo?
‫E, como mencionei, é apenas uma consulta.
‫E então, digamos que, para começar, queremos apenas selecionar
‫documentos que tenham uma média
‫de classificações maior ou igual a 4. 5
‫Então você pode fazer isso?
‫Vou te dar um segundo para fazer isso aqui.
‫Então, eu espero que você tenha feito isso.
‫Portanto, a média das avaliações deve ser maior ou
‫igual a 4. 5
‫E então é isso, essa é a primeira etapa.
‫E normalmente esta fase do jogo é apenas uma fase preliminar para
‫depois se preparar para as próximas fases que se seguem.
‫Portanto, o próximo é agora a fase de grupos.
‫Então agrupe e
‫aí precisamos passar sempre apenas outro objeto.
‫Parece meio estranho com todos esses objetos, mas, sim,
‫você já viu isso antes e o
‫MongoDB simplesmente funciona dessa maneira.
‫São sempre objetos, dentro de objetos, dentro de objetos.
‫E este grupo aqui é onde a verdadeira
‫magia acontece porque como
‫o nome diz, ele nos permite
‫agrupar documentos, basicamente usando acumuladores.
‫E um acumulador é,
‫por exemplo, até calculando uma média.
‫Portanto, se tivermos cinco tours, cada um deles
‫com uma classificação, podemos calcular a classificação média usando o grupo.
‫E então vamos fazer exatamente isso aqui.
‫Agora, a primeira coisa que sempre precisamos
‫especificar é o id, porque é aqui que vamos especificar
‫o que queremos agrupar.
‫Por enquanto, dizemos nulo aqui porque queremos ter
‫tudo em um grupo para que possamos calcular as
‫estatísticas de todos os passeios juntos e
‫não separá-los por grupos.
‫Iremos, um pouco mais tarde, também agrupar por coisas diferentes, por
‫exemplo podemos agrupar pela dificuldade e podemos então,
‫por exemplo, calcular a média para os passeios
‫fáceis, a média para os passeios médios e
‫a média para os passeios difíceis.
‫Então, novamente, podemos agrupar por um de nossos campos e
‫esse campo, vamos especificar aqui, mas por agora,
‫como eu disse, queremos calcular essas médias para todos
‫os passeios juntos em um grande grupo.
‫Nesse caso, dizemos _id e definimos como null.
‫Agora vamos calcular a classificação média.
‫Para fazer isso, simplesmente especificamos um novo
‫campo, então vamos simplesmente chamá-lo de classificação média,
‫assim, e isso vai ser
‫bem, a média,
‫que é mais um operador do MongoDB, então este aqui.
‫Você o encontrará na referência se procurar.
‫Portanto, este é um operador matemático que
‫calcula a média e agora o nome do campo.
‫E novamente, eu sei que isso vai parecer muito
‫estranho, mas para especificar o campo do qual
‫queremos calcular a média, precisamos usar o
‫cifrão, mas entre aspas aqui e depois
‫o nome do campo.
‫Portanto, as classificações são médias neste caso.
‫E vamos calcular também o preço médio.
‫Então, o preço médio, e novamente, deu errado aqui, e
‫então a
‫média e então novamente, o nome
‫do campo e entre aspas e
‫com este cifrão.
‫Certo, então parece meio estranho de
‫novo, mas
‫é assim que o pipeline de agregação funciona.
‫Então, temos o preço médio.
‫Na verdade, vamos calcular também o
‫preço mínimo, então o menor preço e o maior preço.
‫Então
‫minPrice e de agora em diante, tudo parecerá parecido,
‫então agora usamos o
‫operador min e novamente o nome do campo como este.
‫E uma vírgula aqui e agora vamos apenas
‫duplicar esta para calcular o preço máximo.
‫E agora, vamos realmente dar uma olhada no
‫que já temos neste ponto.
‫Agora, precisamos enviar essa resposta e,
‫novamente, vou
‫pegar algumas dessas respostas já feitas aqui.
‫Portanto, os dados que queremos enviar são chamados de estatísticas.
‫E agora tudo o que precisamos fazer é adicionar uma
‫nova rota aqui em nossas rotas de turismo e, novamente,
‫vou editar aqui, bem no topo.
‫Então, roteador. route
‫/ gettour, ou na verdade apenas tour-stats, assim porque
‫get já está definido no método HTTP.
‫Portanto, não há necessidade de repetir no nome.
‫Então, tourController. getTourStats.
‫Dê um cofre e vamos realmente testá-lo agora.
‫Estou muito empolgado para testá-lo agora, para ver
‫se funciona, porque, novamente, é uma ferramenta incrível e
‫poderosa que
‫permite fazer muitas coisas.
‫Então, tour-stats, envie-o e
‫esse não é realmente o resultado
‫que estávamos esperando, então é apenas o pipeline que
‫definimos, mas eu já sei por que é.
‫Então não esperamos o resultado.
‫Então isso, basicamente, como
‫uma consulta normal, retornará um objeto agregado.
‫Assim . find retornará uma consulta e. agregado vai
‫retornar um objeto agregado.
‫E então, só quando
‫esperamos, ele realmente volta com o resultado.
‫É por isso também que definimos esta função aqui como
‫uma função assíncrona, para que possamos usar o await
‫ali e este é o lugar certo.
‫Vamos tentar novamente.
‫E aqui vamos nós!
‫Tão bom!
‫A gente tem a nota média de todos os nossos tours,
‫a gente tem o
‫preço médio que vocês veem é 1563 e aí o mínimo e o máximo né?
‫E a partir de nossos dados, podemos
‫realmente confirmar que isso é verdade.
‫Tão bom!
‫Muito, muito bom.
‫Agora, mais uma coisa que
‫quero fazer aqui é calcular o número
‫total de avaliações que temos e também o número total de passeios.
‫Portanto, temos a classificação
‫média aqui e vamos realmente fazer
‫isso antes,
‫então
‫numRatings, como este e você provavelmente pode
‫adivinhar que este aqui é chamado de soma e, em seguida,
‫ratingsA Average, ou na verdade não ratingsA Average, mas ratingsQuantity, certo?
‫É aí que o número de classificações é
‫armazenado e, portanto, o número de classificações, o total,
‫será a soma de todos eles.
‫E agora, o último, é o número de tours
‫e esse é um pouco mais
‫complicado, então esse é um bom exemplo para mostrar a vocês aqui.
‫Então, ainda queremos somar, somar tudo, basicamente,
‫então ainda usamos soma, mas o
‫que vamos somar?
‫Bem, basicamente adicionamos um para cada documento,
‫então dizemos 1 e é isso.
‫Então, basicamente, para cada documento
‫que vai passar por esse pipeline,
‫um será adicionado a esse contador numérico.
‫Vamos chamá-lo de numTours.
‫E então, sim, vamos testar agora, novamente.
‫E de fato temos nossos nove tours e
‫já sabemos que temos nove.
‫Portanto, essas são todas as estatísticas de todos os passeios juntos, mas vamos
‫agora passar para o próximo nível.
‫Como eu disse antes, agora podemos agrupar nossos resultados
‫para campos diferentes.
‫E vamos começar com a dificuldade.
‫E isso é bastante semelhante a especificar os campos lá embaixo,
‫que são simplesmente o cifrão e, em
‫seguida, o nome do campo.
‫Então $ dificuldade, dê um cofre e é isso.
‫Envie aqui, e agora temos todas as
‫estatísticas definidas para cada uma dessas três dificuldades.
‫Isso é realmente incrível.
‫Então essa é a parte que me deixa boquiaberto.
‫É absolutamente fantástico.
‫Quer dizer, você pode começar a ver todos os
‫tipos de coisas, todos os tipos
‫de manipulação de dados que você pode fazer usando esse pipeline, certo?
‫Portanto, podemos realmente começar a analisar as coisas,
‫por exemplo, vemos que os passeios mais fáceis são
‫aqueles que obtêm as classificações mais baixas
‫com um 4. 6, enquanto os passeios
‫médios são os que obtêm as classificações mais elevadas.
‫A gente vê também que
‫os passeios difíceis são os mais caros
‫com preço médio de 1997, enquanto os mais fáceis são também
‫os mais baratos com preço de 1272, certo?
‫Vemos também que os
‫passeios mais fáceis são os que
‫temos mais, então quatro fáceis e apenas dois difíceis, certo?
‫Portanto, podemos usar isso, é claro,
‫para obter todos os tipos de insights sobre nossos dados.
‫Vamos comentar
‫este aqui e vamos tentar outro, por
‫exemplo, por avaliações, por que não,
‫vamos apenas experimentar, ver o que temos.
‫Por exemplo, temos dois tours, basicamente com uma
‫classificação de 4. 5, temos
‫dois passeios com 4. 7, um passeio com 4. 8 e
‫três tours com 4. 9
‫Ah, e também aqui embaixo, uma turnê com 4. 6, e por
‫exemplo, um insight que podemos obter
‫aqui é que os passeios muito caros com
‫esse preço médio de 1997 têm avaliações extremamente boas.
‫Então, todos os tipos de coisas que podemos fazer aqui.
‫Vamos nos livrar deste, vamos adicionar este de volta, e agora
‫podemos até mesmo
‫fazer algumas operações com este.
‫Então, apenas por diversão, vamos colocar essa dificuldade em maiúsculas.
‫Então, é claro, vai ser outro objeto aqui e aqui
‫na frente é o operador.
‫E então o operador, neste caso, é denominado $ toUpper.
‫Então, mais um operador MongoDB.
‫Portanto, verifique e agora está escrito em maiúsculas.
‫Excelente!
‫Portanto, temos aqui a fase de grupos, que está bastante completa.
‫Então, vamos tentar outro que é um estágio de classificação.
‫Portanto, outro objeto em nosso array para mais um estágio e
‫este é chamado de sort.
‫Então, classifique e aí, precisamos de outro objeto, e ele
‫meio que completou automaticamente este, não sei por que,
‫e aqui agora podemos especificar por
‫qual campo queremos classificar isso e vamos realmente usar o preço médio.
‫E agora aqui na classificação, realmente precisamos usar os
‫nomes de campo que especificamos aqui no grupo.
‫Não podemos mais usar os nomes antigos porque neste ponto
‫eles já se foram.
‫Eles não existem mais.
‫Então, neste ponto, no pipeline
‫de agregação, realmente já temos esses resultados.
‫Então, esses são agora nossos documentos basicamente.
‫Portanto, se você quiser classificar pelo preço médio, este
‫é o nome do campo que devemos usar.
‫Então podemos dizer o preço médio
‫e então podemos dizer 1 para ascendente.
‫Então, vamos experimentar.
‫E sim, de fato.
‫Esse é o mais baixo e esse é o mais alto.
‫Excelente!
‫Então fizemos muitas coisas.
‫Deixe-me apenas mostrar que também podemos repetir estágios.
‫Então, vamos fazer outra combinação
‫aqui e esta
‫é apenas para mostrar que
‫podemos repetir estágios e também quero mostrar outro operador.
‫Então, vamos selecionar por id e lembrar que id
‫é a dificuldade, certo?
‫Então, acabamos de especificar isso aqui.
‫Então, queremos o id e agora um novo operador
‫que ainda não usamos.
‫Queremos que não seja igual a, digamos, fácil.
‫E assim, assim, vamos
‫selecionar todos os documentos que não são fáceis.
‫Então, nesse caso,
‫aquele que diz médio e difícil, certo?
‫Então, basicamente, excluindo aquele que diz fácil, certo?
‫Então, novamente, não é
‫realmente útil aqui porque isso vai tirar muitos dos nossos dados significativos,
‫mas apenas para mostrar que podemos,
‫é claro, combinar várias vezes.
‫Nesse caso, combinamos uma vez antes de realmente
‫fazer o grupo e, em seguida, combinamos quando estávamos prontos,
‫fazendo o agrupamento.
‫Agora, vamos realmente manter isso aqui, fora
‫do nosso pipeline de agregação, mas
‫vou deixá-lo aqui, apenas para que você
‫o mantenha como uma referência.
‫Salve novamente, tente novamente e estes são os
‫nossos resultados para obter as
‫estatísticas do tour.
‫Então, muito bom, muito bom.
‫Espero que tenham gostado
‫deste vídeo e, no próximo, continuaremos
‫usando o pipeline de agregação para fazer mais alguns cálculos.
‫E para mostrar mais algumas etapas diferentes.
‫Portanto, fique atento para isso.