ldferrari / sd-05-project-mongodb-aggregations

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

Boas vindas ao repositório do projeto de Aggregations!

Você já usa o GitHub diariamente para desenvolver os exercícios, certo? Agora, para desenvolver os projetos, você deverá seguir as instruções a seguir. Fique atento a cada passo e, se tiver qualquer dúvida, nos envie por Slack! #vqv 🚀

Aqui você vai encontrar os detalhes de como estruturar o desenvolvimento do seu projeto a partir deste repositório, utilizando uma branch específica e um Pull Request para colocar seus códigos.


Data de Entrega

O projeto tem até a seguinte data: 13/11/2020 - 14:00h. Para ser entregue a avaliação final.


Instruções para entregar seu projeto:

ANTES DE COMEÇAR A DESENVOLVER:

  1. Clone o repositório
  • git clone git@github.com:tryber/sd-05-project-mongodb-aggregations.git.
  • Entre na pasta do repositório que você acabou de clonar:
    • cd sd-05-project-mongodb-aggregations
  1. Crie uma branch a partir da branch master
  • Verifique que você está na branch master
    • Exemplo: git branch
  • Se não estiver, mude para a branch master
    • Exemplo: git checkout master
  • Agora crie uma branch à qual você vai submeter os commits do seu projeto
    • Você deve criar uma branch no seguinte formato: nome-de-usuario-nome-do-projeto
    • Exemplo: git checkout -b seu-nome-mongodb-aggregations
  1. Para cada exercício você deve criar um novo arquivo JS dentro de uma pasta na raiz do seu projeto chamada challenges seguindo a seguinte estrutura:
  • desafio1.js, desafio2.js, ..., desafioN.js
  1. Adicione as mudanças ao stage do Git e faça um commit
  • Verifique que as mudanças ainda não estão no stage
    • Exemplo: git status (deve aparecer o arquivo que você alterou como desafio1.js)
  • Adicione o novo arquivo ao stage do Git
    • Exemplo:
      • git add . (adicionando arquivo de solução challenges/desafio1.js para desafio 1)
      • git status (deve aparecer listado o arquivo challenges/desafio1.js em verde)
  • Faça o commit inicial
    • Exemplo:
      • git commit -m 'iniciando o projeto MongoDB aggregations' (fazendo o primeiro commit)
      • git status (deve aparecer uma mensagem tipo nothing to commit )
  1. Adicione a sua branch com o novo commit ao repositório remoto
  • Usando o exemplo anterior: git push -u origin seu-nome-mongodb-aggregations
  1. Crie um novo Pull Request (PR)
  • Vá até a página de Pull Requests do repositório no GitHub
  • Clique no botão verde "New pull request"
  • Clique na caixa de seleção "Compare" e escolha a sua branch com atenção
  • Clique no botão verde "Create pull request"
  • Adicione uma descrição para o Pull Request e clique no botão verde "Create pull request"
  • Não se preocupe em preencher mais nada por enquanto!
  • Volte até a página de Pull Requests do repositório e confira que o seu Pull Request está criado

Entregáveis

Temos, neste projeto, uma série de desafios com diferentes níveis de complexidade. Cada desafio deve ser resolvido em seu arquivo próprio.

  1. Leia a pergunta e crie no diretório challenges um arquivo chamado desafioN.js, em que N é o número do desafio.

  2. O arquivo deve conter apenas o código MQL (Mongo Query Language) do desafio resolvido. Não se esqueça de incluir o ponto e vírgula (";") no final de suas queries, como no exemplo a seguir:

    db.movies.count();

    ⚠️ Restrições ⚠️:

    • Não se deve usar aspas simples para especificar campos e/ou valores. Quando for necessário usar aspas, use somente aspas duplas;

    • Não se deve usar o comando use aggregations, haja visto que os testes já se conectam automaticamente à base aggregations.

  3. Faça isso até finalizar todos os desafios e depois siga as instruções de como entregar o projeto em Instruções para entregar seu projeto.

  4. Para entregar o seu projeto você deverá criar um Pull Request neste repositório. Este Pull Request deverá conter no diretório challenges os arquivos desafio1.js, desafio2.js e assim por diante até o desafio14.js, que conterão seu código MQL de cada desafio, respectivamente.

⚠️ É importante que seus arquivos tenham exatamente estes nomes! ⚠️

Qualquer dúvida, procure a monitoria. Lembre-se que você pode consultar nosso conteúdo sobre Git & GitHub sempre que precisar!


O que deverá ser desenvolvido?

É isso aí, mais um bloco finalizado! Agora chegamos ao fim do último bloco do nosso módulo de NoSQL e MongoDB. Você viu vários métodos e operadores para executar operações de agregação de dados no MongoDB, e vai colocá-los em prática em mais um projeto.

Para esse projeto, diferentemente dos outros, você vai utilizar vários datasets, de forma que possa praticar em vários cenários os diversos operadores e estágios do aggregation pipeline.

Vamos trabalhar com dados do IMDB, dados sobre empresas aéreas e também dados que contenham registros de deslocamento de pessoas que utilizam bicicletas. Esperamos que você curta muito o projeto e fixe muito bem o que aprendeu até aqui!

Então vamos lá aplicar seu conhecimento nesses cenários muito legais! 😉


Análise Estática

Usaremos o ESLint para fazer a análise estática do seu código.

Este projeto já vem com as dependências relacionadas ao linter configuradas no arquivos package.json.

Para poder rodar os ESLint em um projeto basta executar o comando npm install dentro do projeto e depois npm run lint. Se a análise do ESLint encontrar problemas no seu código, tais problemas serão mostrados no seu terminal. Se não houver problema no seu código, nada será impresso no seu terminal.

Você pode também instalar o plugin do ESLint no VSCode, bastar ir em extensions e baixar o plugin ESLint.


Instruções para restaurar o banco de dados aggregations

  1. Abra o terminal e conecte-se à sua instância local do MongoDB. Se você receber uma mensagem de erro com uma mensagem como Connection refused, tente reiniciar sua instância (veja como fazer isso aqui).

  2. Agora que você tem certeza de que a sua instância está no ar e que você está conectado a ela, digite exit. Você voltará ao terminal para iniciar a importação dos dados.

  3. Na raiz do diretório do projeto, execute o seguinte comando que fará a restauração da base de dados aggregations:

    DBNAME=aggregations ./scripts/resetdb.sh assets
  • A execução desse script criará um banco de dados chamado aggregations e importará todas as suas coleções.

⚠️ Como tanto esse script quanto o script de execução local dos testes (mostrado na seção seguinte), restauram a base de dados aggregations, se atente a salvar seu progresso nos arquivos de desafio! ⚠️


Implementações técnicas

Para executar localmente os testes, é preciso escrever o seguinte no seu terminal, estando na raiz do diretório do projeto:

./scripts/evaluate.sh

Esse script passará por todos os desafios e imprimirá um relatório indicando se passou ou não para cada desafio.

⚠️ Como na avaliação o banco de dados aggregations é restaurado de um teste para outro, se atente a fazer uso do banco restaurado na hora de fazer um desafio. ⚠️


Requisitos do projeto

Monte queries para encontrar as informações dos desafios a seguir.

Desafio 1

Ajude a Trybe a escolher um filme para a próxima noite! Baseado em uma pesquisa, decidimos que os filmes em potencial devem atender aos seguintes critérios:

  • imdb.rating deve ser ao menos 7;
  • genres não deve conter Crime ou Horror;
  • rated deve ser igual a PG ou G;
  • languages contém English e Spanish.

Utilizando a coleção movies, faça um pipeline que retorne todos esses filmes.

Sua query deve retornar 41 documentos.

Desafio 2

A escolha do filme da noite foi um sucesso, mas infelizmente ficamos com nossa banda de internet quase esgotada, e ainda precisamos de uma nova recomendação de filme. Para diminuir o volume de dados trafegados, utilizando o mesmo pipeline anterior, retorne apenas os campos title, rated, imdb.rating, imdb.votes e year, modificando seus nomes para titulo, avaliado, notaIMDB, votosIMDB e ano, respectivamente.

O resultado da sua query deve ter o seguinte formato:

{ "titulo" : "A Streetcar Named Desire", "avaliado" : "PG", "notaIMDB" : 8.1, "votosIMDB" : 72364, "ano" : 1951 }
// Demais documentos
Desafio 3

Agora que você tem os campos essenciais, retorne esses filmes ordenados por ano e nota IMDB de forma decrescente e o título por ordem alfabética (nesta ordem de desempate).

O resultado da sua query deve ter o seguinte formato:

{ "titulo" : "McFarland, USA", "avaliado" : "PG", "notaIMDB" : 7.5, "votosIMDB" : 14091, "ano" : 2015 }
// Demais documentos
Desafio 4

Nosso dataset de filmes tem muitos documentos diferentes, alguns com títulos "mais complexos" do que outros. Se quisermos analisar nossa coleção para encontrar títulos de filmes que têm uma só palavra no título, poderíamos buscar todos os filmes do dataset e processar isso na aplicação, mas o Aggregation Framework nos permite fazer isso diretamente no lado do banco de dados.

Crie um pipeline que adicione um campo title_split contendo a lista de palavras presentes em title e retorne apenas o novo campo title_split dos filmes com o título composto apenas de uma palavra, ordernando-os por title em ordem alfabética. Por exemplo, "Cinderela" e "3-25" devem entrar nessa contagem, mas "Cast Away" não.

Dica: utilize os operadores $split, $size e $sort para te auxiliar. Documentação do $split

Sua query deve retornar 8068 documentos.

Desafio 5

Temos outra noite de filme aqui na Trybe e, desta vez, nós perguntamos à equipe quais são seus atores ou atrizes preferidos. Aqui está o resultado:

  • Sandra Bullock
  • Tom Hanks
  • Julia Roberts
  • Kevin Spacey
  • George Clooney

Para filmes lançados nos Estados Unidos (campo countries), com tomatoes.viewer.rating maior ou igual a 3, crie um novo campo chamado num_favs, que represente quantos atores ou atrizes da nossa lista de favoritos aparecem no elenco (campo cast) do filme.

Ordene os resultados por num_favs, tomatoes.viewer.rating e title, todos em ordem decrescente.

Por fim, utilizando o mesmo pipeline, responda: Qual o título do vigésimo quinto filme do resultado dessa agregação?

Dica: coloque a lista de atores e atrizes favoritos em uma variável e explore operadores como $size e $setIntersection.

O resultado da sua query deve ter o seguinte formato:

{ "title" : <nome_do_filme> }
Desafio 6

Vamos explorar mais operadores aritméticos!

Considerando todos os filmes que ganharam o Oscar pelo menos uma vez, calcule o maior valor, menor valor, média e o desvio padrão das avaliações (campo imdb.rating). Para a média e o desvio padrão arredonde os valores para uma casa decimal utilizando o $round.

Dica: todos os filmes na coleção, que já ganharam um Oscar, começam com uma sequência de string parecida com essas abaixo, portanto $regex é um operador bem-vindo:

Won 10 Oscars
Won 1 Oscar

Utilizem o $stdDevSamp para calcular o desvio padrão.

O resultado da sua query deve ter o seguinte formato:

{
  "maior_rating" : <maior_rating>,
  "menor_rating" : <menor_rating>,
  "media_rating" : <media_rating>,
  "desvio_padrao" : <desvio_padrao>
}
Desafio 7

Vamos nos aprofundar um pouco mais em nossa coleção de filmes. Queremos contar quantos filmes cada um dos atores e atrizes do elenco (cast) já participou e obter uma média do campo imdb.rating para cada um desses atores e atrizes.

Traga o nome do ator ou atriz, número de filmes em que participou e a média do imdb desses filmes arredondada para uma casa decimal usando o operador $round. Considere somente os membros do elenco de filmes com o idioma inglês (English). Exiba a lista em ordem decrescente de documentos pelo número de filmes e nome do ator ou atriz.

Sua query deve retornar 47055 documentos. Cada documento no resultado deve ter o seguinte formato:

{ "_id" : "John Wayne", "numeroFilmes" : 107, "mediaIMDB" : 6.4 }
Desafio 8

Trocando de contexto, vamos utilizar nosso outro dataset que contém dados de empresas aéreas, suas rotas, seus voos e parcerias.

Liste todas as parcerias da coleção air_alliances, que voam rotas com um Boing 747 ou um Airbus A380 (que estão abreviados para 747 e 380 no campo airplane na coleção air_routes, respectivamente), e descubra qual delas tem o maior número de rotas com esses aviões.

O resultado da sua query deve ter o seguinte formato:

{ "_id" : <nome_da_alianca>, "totalRotas" : <total_de_rotas> }
Desafio 9

A partir da coleção trips, determine o menor e o maior ano de nascimento. Guarde essa informação, você precisará dela mais tarde.

Não considere documentos com valores vazios ("") ou em que o campo não existe!

Para este desafio utilize o operador $toInt para converter de string para valor inteiro.

O resultado da sua query deve ter o seguinte formato:

{ "maiorAnoNascimento" : <ano>, "menorAnoNascimento" : <ano> }
Desafio 10

Encontre a média de viagens por tipo de usuário. Exiba o valor em horas com apenas duas casas decimais e a média de viagens ordenada de forma crescente. Para arredondar a média use o $round.

O resultado da sua query deve ter o seguinte formato:

{ "tipo" : <tipo>, "duracaoMedia" : <duracaoMedia> }
// ...
Desafio 11

Determine qual o dia da semana com maior número de viagens iniciadas.

Dica: Utilize o operador $dayOfWeek para extrair o dia da semana como um número de uma data.

O resultado da sua query deve ter o seguinte formato:

{ "diaDaSemana" : <dia_da_semana>, "total" : <total_de_viagens> }
Desafio 12

Agora que você já sabe o dia com mais viagens, determine qual estação tem o maior número de viagens nesse dia da semana. Mas, para isso, adicione o que for necessário ao pipeline anterior. Exiba apenas o nome da estação e o total de viagens.

Dica: Utilize o operador $dayOfWeek para extrair o dia da semana como um número de uma data.

O resultado da sua query deve ter o seguinte formato:

{ "nomeEstacao" : <nome_da_estacao>, "total" : <total_de_viagens> }
Desafio 13

Determine a duração média das viagens iniciadas no dia 10/03/2016, em minutos. Arredonde o resultado para cima.

O resultado da sua query deve ter o seguinte formato:

{ "duracaoMediaEmMinutos" : <duracao_media_em_minutos> }
Desafio 14

Baseado na duração média das viagens, determine quais são as 5 bicicletas que foram mais utilizadas. Exiba o resultado em minutos arredondados para cima e em ordem decrescente.

O resultado da sua query deve ter o seguinte formato:

{ "bikeId" : <bike_id>, "duracaoMedia" : <duracao_media> }
{ "bikeId" : <bike_id>, "duracaoMedia" : <duracao_media> }
{ "bikeId" : <bike_id>, "duracaoMedia" : <duracao_media> }
{ "bikeId" : <bike_id>, "duracaoMedia" : <duracao_media> }
{ "bikeId" : <bike_id>, "duracaoMedia" : <duracao_media> }

DURANTE O DESENVOLVIMENTO

  • LEMBRE-SE DE CRIAR TODOS OS ARQUIVOS DENTRO DA PASTA challenges

  • Faça commits das alterações que você fizer no código regularmente

  • Lembre-se de sempre após um (ou alguns) commits atualizar o repositório remoto

  • Os comandos que você utilizará com mais frequência são:

    1. git status (para verificar o que está em vermelho - fora do stage - e o que está em verde - no stage)
    2. git add (para adicionar arquivos ao stage do Git)
    3. git commit (para criar um commit com os arquivos que estão no stage do Git)
    4. git push -u nome-da-branch (para enviar o commit para o repositório remoto na primeira vez que fizer o push de uma nova branch)
    5. git push (para enviar o commit para o repositório remoto após o passo anterior)

DEPOIS DE TERMINAR O DESENVOLVIMENTO (OPCIONAL)

Para sinalizar que o seu projeto está pronto para o "Code Review" dos seus colegas, faça o seguinte:

  • Vá até a página DO SEU Pull Request, adicione a label de "code-review" e marque seus colegas:

    • No menu à direita, clique no link "Labels" e escolha a label code-review;

    • No menu à direita, clique no link "Assignees" e escolha o seu usuário;

    • No menu à direita, clique no link "Reviewers" e digite students, selecione o time tryber/students-sd-05.

Caso tenha alguma dúvida, aqui tem um video explicativo.


REVISANDO UM PULL REQUEST

Use o conteúdo sobre Code Review para te ajudar a revisar os Pull Requests.

#VQV 🚀

About


Languages

Language:JavaScript 77.7%Language:Shell 22.3%