Sexto projeto do módulo de Back-end do curso de desenvolvimento web da Trybe
Contexto
Este é o último projeto focado exclusivamente em MongoDB e nele trabalhamos com o Aggregation Framework, um conjunto de ferramentas destinadas ao processamento de dados por meio de pipelines. Utilizando ele podemos agrupar dados de múltiplos documentos, realizar várias operações sobre eles e retornar um resultado processado.
Objetivo do projeto
Trabalhar com dados do IMDB, dados sobre empresas aéreas e também dados que contenham registros de deslocamento de pessoas que utilizam bicicletas.
Para esse projeto, diferentemente dos outros, serão usadas várias coleções, de forma a praticar em vários cenários os diversos operadores e estágios do aggregation pipeline
.
Principais habilidades desenvolvidas nesse trabalho
- Executar buscas complexas no banco MongoDB
- Usar os operadores de aggregation para fazer uma pipeline
Tecnologia utilizada
Ajude a Trybe a escolher um filme para a próxima noite! Baseado em uma pesquisa, decidimos que os filmes em potencial devem atender alguns critérios, vejamos:
imdb.rating
deve ser maior ou igual a7
;genres
não deve conterCrime
ouHorror
;rated
deve ser igual aPG
ouG
;languages
contémEnglish
eSpanish
.- Utilize a coleção
movies
.
Sua query deve retornar 41
documentos.
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 exatamente o seguinte formato (incluindo a ordem dos campos):
{ "titulo" : "A Streetcar Named Desire", "avaliado" : "PG", "notaIMDB" : 8.1, "votosIMDB" : 72364, "ano" : 1951 }
// Demais documentos
Agora que você tem os campos essenciais, aplique mais um estágio na pipeline do desafio anterior que atenda a seguinte demanda:
Retorne esses filmes ordenados por ano e nota IMDB de forma decrescente e título por ordem alfabética.
O resultado da sua query deve ter exatamente o seguinte formato (incluindo a ordem dos campos):
{ "titulo" : "McFarland, USA", "avaliado" : "PG", "notaIMDB" : 7.5, "votosIMDB" : 14091, "ano" : 2015 }
// Demais documentos
Nossa coleção 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 da coleção e processar isso na aplicação, mas o Aggregation Framework
nos permite fazer isso diretamente no lado do banco de dados.
Crie uma pipeline que retorna documentos com o novo campo title_split
, ela deve seguir as seguintes condições:
title_split
deve conter uma lista de palavras presentes emtitle
.- A pipeline deve retornar apenas filmes com o título composto apenas de uma palavra.
- A pipeline deve ser ordenada por
title
em ordem alfabética. - A pipeline deve retornar apenas o campo
title_split
.
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.
Temos outra noite de filme aqui na Trybe e, desta vez, nós perguntamos à equipe quais são suas pessoas preferidas como atores e/ou atrizes. Aqui está o resultado:
- Sandra Bullock
- Tom Hanks
- Julia Roberts
- Kevin Spacey
- George Clooney
Considerando esta lista, crie uma pipeline que retorne o title
do vigésimo quinto filme da agregação que satisfaz as seguintes condições:
countries
é Estados unidos no banco estará classificado como USAtomatoes.viewer.rating
maior ou igual a3
- Crie um novo campo chamado
num_favs
, que represente quantos atores ou atrizes da nossa lista de favoritos aparecem no elenco (informação do campocast
no banco) do filme, caso ele possua favoritos. - Ordene os resultados por
num_favs
,tomatoes.viewer.rating
etitle
, todos em ordem decrescente.
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 exatamente o seguinte formato (incluindo a ordem dos campos):
{ "title" : <nome_do_filme> }
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 (informação do campo imdb.rating
no banco)
- 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 (informação do campo awards
no banco), 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 exatamente o seguinte formato (incluindo a ordem dos campos):
{
"maior_rating" : <maior_rating>,
"menor_rating" : <menor_rating>,
"media_rating" : <media_rating>,
"desvio_padrao" : <desvio_padrao>
}
Vamos nos aprofundar um pouco mais em nossa coleção de filmes.
Conte quantos filmes cada um dos atores e atrizes do elenco (cast
no banco) já participou e obtenha 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
- 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 exatamente o seguinte formato (incluindo a ordem dos campos):
{ "_id" : "John Wayne", "numeroFilmes" : 107, "mediaIMDB" : 6.4 }
Trocando de contexto, vamos utilizar nossa outra coleção 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 , para descobrir qual delas tem o maior número de rotas com esses aviões.
No campo airplane
, na coleção air_routes
:
- Boing 747 está abreviado para
747
- Airbus A380 está abreviado para
380
O resultado da sua query deve ter exatamente o seguinte formato (incluindo a ordem dos campos):
{ "_id" : <nome_da_alianca>, "totalRotas" : <total_de_rotas> }
-
Guarde essa informação, você precisará dela mais tarde.
-
Não considere documentos com valores vazios (
""
) e 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 exatamente o seguinte formato (incluindo a ordem dos campos):
{ "maiorAnoNascimento" : <ano>, "menorAnoNascimento" : <ano> }
- Exiba o valor em horas com apenas duas casas decimais
- Exiba a média de viagens ordenada de forma crescente.
Para arredondar a média use o $round
.
O resultado da sua query deve ter exatamente o seguinte formato (incluindo a ordem dos campos):
{ "tipo" : <tipo>, "duracaoMedia" : <duracaoMedia> }
// ...
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 exatamente o seguinte formato (incluindo a ordem dos campos):
{ "diaDaSemana" : <dia_da_semana>, "total" : <total_de_viagens> }
Usando a pipeline anterior que retorna o dia com mais viagens, determine qual estação tem o maior número de viagens nesse dia da semana.
- 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 exatamente o seguinte formato (incluindo a ordem dos campos):
{ "nomeEstacao" : <nome_da_estacao>, "total" : <total_de_viagens> }
- Arredonde o resultado para cima.
O resultado da sua query deve ter exatamente o seguinte formato (incluindo a ordem dos campos):
{ "duracaoMediaEmMinutos" : <duracao_media_em_minutos> }
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 exatamente o seguinte formato (incluindo a ordem dos campos):
{ "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> }