Para realizar o projeto, atente-se a cada passo descrito a seguir, 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.
Ao iniciar este projeto, você concorda com as diretrizes do Código de Conduta e do Manual da Pessoa Estudante da Trybe.
🤷🏽♀️ Como entregar
Para entregar o seu projeto você deverá criar um Pull Request neste repositório.
Lembre-se que você pode consultar nosso conteúdo sobre Git & GitHub e nosso Blog - Git & GitHub sempre que precisar!
👨💻 O que deverá ser desenvolvido
Agora que você já aprendeu MongoDB, chegou a hora de praticar todos os conceitos ensinados até aqui por meio do projeto commerce!
Nesse projeto, você vai trabalhar com o banco de dados commerce
, que contém dados do cardápio do McDonald's, como ingredientes, valores nutricionais e dados fictícios de vendas. As instruções de como restaurar o banco podem ser lidas a seguir.
🗓 Data de Entrega
- Este projeto é individual;
- Serão
1
dias de projeto; - Data de entrega para avaliação final do projeto:
16/01/2023 14:00
.
‼️ Antes de começar a desenvolver
- Clone o repositório
-
git clone [email protected]:tryber/sd-022-b-mongodb-commerce.git
. -
Entre na pasta do repositório que você acabou de clonar:
cd sd-022-b-mongodb-commerce
- Crie uma branch a partir da branch
master
-
Verifique que você está na branch
master
- Exemplo:
git branch
- Exemplo:
-
Se não estiver, mude para a branch
master
- Exemplo:
git checkout master
- Exemplo:
-
Agora crie uma branch na 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 seunome-mongodb-commerce
- Você deve criar uma branch no seguinte formato:
- 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
- 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)
- Exemplo:
-
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)
- Exemplo:
-
Faça o
commit
inicial- Exemplo:
git commit -m 'iniciando o projeto MongoDB Commerce'
(fazendo o primeiro commit)git status
(deve aparecer uma mensagem tipo nothing to commit )
- Exemplo:
- Adicione a sua branch com o novo
commit
ao repositório remoto
- Usando o exemplo anterior:
git push -u origin joaozinho-sd-022-b-mongodb-commerce
- 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
- Coloque um título para a sua Pull Request
- Exemplo: "Cria tela de busca"
- 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 se o seu Pull Request está criado
⌨️ Durante o desenvolvimento
-
Faça
commits
das alterações que você realizar no código regularmente; -
Lembre-se de sempre após um (ou alguns)
commits
atualizar o repositório remoto; -
Os comandos que você vai utilizar com mais frequência são:
git status
(para verificar o que está em vermelho - fora do stage - e o que está em verde - no stage)git add
(para adicionar arquivos ao stage do Git)git commit
(para criar um commit com os arquivos que estão no stage do Git)git push -u nome-da-branch
(para enviar o commit para o repositório remoto na primeira vez que fizer opush
de uma nova branch)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 "Code Review", 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 timetryber/students-sd-022-b
.
-
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.
🎛 Linter
Para fazer a análise estática do seu código neste projeto, vamos utilizar o linter ESLint. Assim o código estará alinhado com as boas práticas de desenvolvimento, sendo mais legível e de fácil manutenção!
➡️ Este projeto já vem com as dependências relacionadas ao linter configuradas no arquivo package.json
.
➡️ Para poder rodar o ESLint
basta:
-
Executar o comando
npm install
dentro do projeto e depoisnpm run lint
. -
Se a análise do
ESLint
encontrar problemas no seu código, eles 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
noVSCode
. Para isso, bastar ir em extensions e baixar o pluginESLint
.
🛠 Testes
- Para executar localmente os testes, é preciso estar na raiz do diretório do projeto e escrever o seguinte no seu terminal,:
./scripts/evaluate.sh
👀 De olho na dica: esse script vai imprimir um relatório indicando se o teste passou ou não para cada desafio. Como a execução do script envolve restauração da base de dados commerce
de um teste para outro, recomenda-se esperar pela sua execução completa.
- Para executar somente o teste de um desafio, execute o comando abaixo substituindo N pelo número do desafio
./scripts/evaluate.sh desafioN
commerce
é restaurado de um teste para outro durante a avaliação, sempre use o banco restaurado na hora de fazer um desafio. Veja a orientação ➡️ ♻️ Restaurando o banco de dados commerce
.
🐳 Como usar o Docker para este projeto
- Para quem não possui o MongoDB instalado e está utilizando o docker, é necessário executar os testes localmente usando os seguintes passos:
- Acesse o terminal na raiz da pasta do projeto;
- Crie um container com um volume apontando para a pasta do projeto
docker run -d --name=nomeDoContainer -v "$PWD:/app" -p 27017:27017 mongo:5.0
; - Com o container em execução, acesse o terminal do container
docker exec -it nomeDoContainer bash
; - No terminal do container, acesse o diretório
/app
mapeado no volume conforme o passo 2;
Para restaurar o banco de dados é necessário que você esteja dentro do diretório
/app
. Para mais detalhes, veja o tópico: "♻️ Restaurando o banco de dadoscommerce
".
- Por fim, execute o script de testes do projeto:
./scripts/evaluate.sh
. Se por algum motivo a execução do container for finalizada, basta iniciá-lo novamente com o comandodocker start nomeDoContainer
e seguir a partir do passo 3.
♻️ Restaurando o banco de dados `commerce`
⚠️ Aviso: Caso esteja utilizando Docker, certifique-se que tenha seguido os passos do tópico: "🐳 Como usar o Docker para este projeto", pois eles são determinantes para que siga as orientações abaixo.
-
Abra o terminal e conecte-se à sua instância local do MongoDB. Se você receber uma mensagem de erro como Connection refused, tente reiniciar sua instância seguindo as orientações desse link.
-
Quando sua instância estiver no ar e você estiver conectado a ela, digite
exit
. Com isso, você voltará ao terminal para iniciar a importação dos dados. -
Na raiz do diretório do projeto, execute o seguinte comando para restaurar a base de dados
commerce
:
DBNAME=commerce ./scripts/resetdb.sh assets/produtos
- A execução desse script criará um banco de dados chamado
commerce
e importará os dados para a coleçãoprodutos
.
commerce
, portanto sempre salve seu progresso nos arquivos de desafio! Veja a orientação ➡️ 🛠 Testes
👷 Estruturação do projeto
- ⚠ Crie todos os arquivos dentro da pasta
challenges
⚠
Esse projeto possui uma série de desafios com diferentes níveis de complexidade. Cada desafio deve ser resolvido em seu arquivo próprio. Para isso:
-
Leia o comando e crie o diretório
challenges
com um arquivo chamadodesafioN.js
, em que N é o número do desafio. -
O arquivo
desafioN.js
deve conter apenas o código MQL (Mongo Query Language) do desafio resolvido. Lembre-se sempre de incluir o ponto e vírgula (";") no final de suas queries, como no exemplo a seguir:
db.produtos.find();
-
Siga as orientações do passo anterior até finalizar todos os desafios e depois siga as instruções de como entregar o projeto, contidas na Orientação ➡️ 🤝 Depois de terminar o desenvolvimento (OPCIONAL).
-
Para entregar o seu projeto você deve criar um Pull Request neste repositório. Este Pull Request deve conter os arquivos
desafio1.js
,desafio2.js
e assim sucessivamente até odesafio32.js
, no diretóriochallenges
, que terá o códigoMQL
de cada desafio, respectivamente.
Caso você opte por não utilizar Docker para realizar os testes na sua máquina local, é necessário que o clone do projeto seja realizado fora do diretório com nome
Área de Trabalho
. Isso quer dizer que,Área de Trabalho
não pode estar no caminho do diretório onde o projeto foi clonado, pois o script que realiza os testes não consegue "encontrar" pastas que contenham espaços em seus nomes. Para checar se seu projeto está seguindo esse passo corretamente, utilize o comandopwd
no terminal.
-
Não use aspas simples para especificar campos e/ou valores: quando for necessário usar aspas, use somente aspas duplas;
-
Não use o comando
use commerce
, pois os testes já se conectam automaticamente à basecommerce
. -
Todos os seus arquivos devem conter os nomes especificados aqui:
./challenges/desafio1.js
./challenges/desafio2.js
./challenges/desafio{...}.js
./challenges/desafio31.js
./challenges/desafio32.js
🗣 Nos dê feedbacks sobre o projeto!
Ao finalizar e submeter o projeto, não se esqueça de avaliar sua experiência preenchendo o formulário. Leva menos de 3 minutos!
🗂 Compartilhe seu portfólio!
Você sabia que o LinkedIn é a principal rede social profissional e compartilhar o seu aprendizado lá é muito importante para quem deseja construir uma carreira de sucesso? Compartilhe esse projeto no seu LinkedIn, marque o perfil da Trybe (@trybe) e mostre para a sua rede toda a sua evolução.
- Para isso, escreva a query no arquivo
desafio1.js
2 - Ordene a coleção produtos
pela quantidade de lanches vendidos em ordem crescente, mostrando apenas o nome
e a quantidade de lanches vendidos
- Para isso, escreva a query no arquivo
desafio2.js
- Para isso, escreva a query no arquivo
desafio3.js
4 - Retorne os lanches que tiveram vendas maiores que 50
e menores que 100
, mostrando apenas o nome e a quantidade de lanches vendidos
em ordem crescente
- Para isso, escreva a query no arquivo
desafio4.js
5 - Retorne o nome
, as curtidas
e vendidos
dos lanches que tiveram quantidade de curtidas
igual a 36
ou tenham a quantidade de vendas igual a 85
- Para isso, escreva a query no arquivo
desafio5.js
- Para isso, escreva a query no arquivo
desafio6.js
7 - Retorne o nome
e vendidos
dos lanches que tenham sido vendidos
com uma quantidade diferente de 50
e em que o campo tags
não exista
- Para isso, escreva a query no arquivo
desafio7.js
- Para isso, escreva a query no arquivo
desafio8.js
- Para isso, escreva a query no arquivo
desafio9.js
.
10 - Retorne o nome
de todos os lanches que tenham o percentual de proteínas
maior ou igual a 30
e menor ou igual a 40
- Para isso, escreva a query no arquivo
desafio10.js
11 - Retorne o nome
do produto, a quantidade de curtidas
e quantos itens foram vendidos
dos produtos que não sejam iguais a Big Mac
e McChicken
- Para isso, escreva a query no arquivo
desafio11.js
12 - Adicione ketchup
aos ingredientes
para todos os sanduíches menos o McChicken
, garantindo que não haja duplicidade nos ingredientes
Para isso, escreva no arquivo desafio12.js
duas queries, nesta ordem:
-
Crie uma query que adicione
ketchup
aosingredientes
para todos os sanduíches menos oMcChicken
, garantindo que não haja duplicidade nosingredientes
. -
Crie uma query que retorne o
nome
eingredientes
de todos os documentos.
13 - Inclua o campo criadoPor
em todos os documentos, colocando Ronald McDonald
no valor desse campo
Para isso, escreva no arquivo desafio13.js
duas queries, nesta ordem:
-
Crie uma query que adicione o campo
criadoPor
em todos os documentos, colocando"Ronald McDonald"
no valor desse campo. -
Crie uma query que retorne o
nome
ecriadoPor
de todos os produtos.
14 - Crie uma query que retorne todos os lanches que possuem picles em seus ingredientes e mostre apenas os 3
primeiros itens contidos no array valoresNutricionais
- Para isso, escreva a query no arquivo
desafio14.js
- Sua query deve retornar apenas os campos
nome
,ingredientes
evaloresNutricionais
.
👀De olho na dica: para realizar esse requisito, explore a implementação do $slice
através do conteúdo desse link
Para isso, escreva no arquivo desafio15.js
quatro queries, nesta ordem:
-
Crie uma query que inclua o campo
avaliacao
do tipoNumberInt
, com o valor0
em todos os documentos da coleção. -
Crie uma query que incremente o valor do campo
avaliacao
em5
em todos os sanduíches de carne do tipobovino
. 👀De olho na dica: utilize como filtro o campotags
. -
Crie uma query que incremente o valor do campo
avaliacao
em3
em todos os sanduíches deave
. -
Crie uma query que retorne o
nome
eavaliacao
de todos os sanduíches.
Para isso, escreva no arquivo desafio16.js
duas queries, nesta ordem:
-
Crie uma query que inclua somente ao sanduíche
Big Mac
o campoultimaModificacao
com a data corrente. Para a data corrente faça uso do tipodate
outimestamp
. -
Crie uma query que retorne o
nome
de todos os documentos em que o campoultimaModificacao
existe.
Para isso, escreva no arquivo desafio17.js
duas queries, nesta ordem:
-
Crie uma query que insira na coleção
resumoProdutos
um documento com os campos:franquia
com o valorMcDonalds
etotalProdutos
com o valor sendo a quantidade total de produtos registrados na coleçãoprodutos
. -
Crie uma query que retorne os campos
franquia
e ototalProdutos
da coleçãoresumoProdutos
, resultantes da primeira query.
Para isso, escreva no arquivo desafio18.js
duas queries, nesta ordem:
-
Crie uma query que faça a inclusão de
bacon
no final da lista deingredientes
dos sanduíchesBig Mac
eQuarteirão com Queijo
. -
Crie uma query que retorne o
nome
eingredientes
de todos os documentos.
Para isso, escreva no arquivo desafio19.js
duas queries, nesta ordem:
-
Crie uma query que faça a remoção do item
cebola
em todos os sanduíches. -
Crie uma query que retorne o
nome
eingredientes
de todos os documentos.
Para isso, escreva no arquivo desafio20.js
duas queries, nesta ordem:
-
Crie uma query que faça a remoção do primeiro
ingrediente
no sanduícheQuarteirão com Queijo
. -
Crie uma query que retorne o
nome
eingredientes
de todos os documentos.
Para isso, escreva no arquivo desafio21.js
duas queries, nesta ordem:
-
Crie uma query que faça a remoção do último
ingrediente
no sanduícheCheddar McMelt
. -
Crie uma query que retorne o
nome
eingredientes
de todos os documentos.
Para isso, escreva no arquivo desafio22.js
quatro queries, nesta ordem:
- Crie uma query que inclua um campo
vendasPorDia
em todos os sanduíches. O valor deste campo deverá ser um array com sete posições. Cada uma delas representará um dia da semana, e cada posição iniciará em0
. O array deve seguir a estrutura do exemplo abaixo:
"vendasPorDia": [0, 0, 0, 0, 0, 0, 0]
O primeiro item desse array representa as vendas no domingo, o segundo item representa as vendas na segunda-feira, e assim sucessivamente até chegar ao último item, que representa as vendas no sábado.
-
Crie uma query que incremente as vendas de
Big Mac
às quartas-feiras em60
. -
Crie uma query que incremente as vendas de todos os sanduíches de carne do tipo
bovino
aos sábados em120
. -
Crie uma query que retorne o
nome
evendasPorDia
de todos os documentos.
23 - Insira os valores combo
e tasty
no array tags
de todos os sanduíches e aproveite para deixar os valores em ordem alfabética ascendente (A a Z)
Para isso, escreva no arquivo desafio23.js
duas queries, nesta ordem:
-
Crie uma query que faça tanto a inserção dos valores
combo
etasty
no arraytags
de todos os sanduíches. Ordene os valores detags
em ordem alfabética ascendente. -
Crie uma query que retorne o
nome
etags
de todos os documentos.
24 - Ordene em todos os documentos os valores do array valoresNutricionais
pelo campo percentual
de forma decrescente
Para isso, escreva no arquivo desafio24.js
duas queries, nesta ordem:
-
Crie uma query que faça em todos os documentos a ordenação dos valores do array
valoresNutricionais
pelo campopercentual
de forma decrescente. 👀De olho na dica: mesmo sem adicionar nenhum novo valor, para essa operação é necessário utilizar também o modificador$each
. -
Crie uma query que retorne o
nome
evaloresNutricionais
de todos os documentos.
25 - Adicione o valor muito sódio
ao final do array tags
nos produtos em que o percentual
de sódio
seja maior ou igual a 40
Para isso, escreva no arquivo desafio25.js
duas queries, nesta ordem:
-
Crie uma query que faça a adição do valor
muito sódio
ao final do arraytags
nos produtos em que opercentual
desódio
seja maior ou igual a40
. -
Crie uma query que retorne o
nome
etags
de todos os documentos.
26 - Adicione o valor contém sódio
ao final do array tags
nos produtos em que o percentual
de sódio
seja maior do que 20
e menor do que 40
Para isso, escreva no arquivo desafio26.js
duas queries, nesta ordem:
-
Crie uma query que faça a adição do valor
contém sódio
ao final do arraytags
nos produtos em que opercentual
desódio
seja maior do que20
e menor do que40
. -
Crie uma query que retorne o
nome
etags
de todos os documentos.
- Para isso, escreva a query no arquivo
desafio27.js
- Para isso, escreva a query no arquivo
desafio28.js
Para isso, escreva no arquivo desafio29.js
duas queries, nesta ordem:
-
Crie uma query que faça a renomeação do campo
descricao
paradescricaoSite
em todos os documentos. -
Crie uma query que retorne o
nome
edescricaoSite
de todos os documentos.
Para isso, escreva no arquivo desafio30.js
duas queries, nesta ordem:
-
Crie uma query que faça a remoção do campo
curtidas
do itemBig Mac
. -
Crie uma query que retorne o
nome
para todos os documentos ecurtidas
(exceto paraBig Mac
).
31 - Retorne o nome
dos sanduíches em que o número de curtidas
é maior que o número de sanduíches vendidos
- Para isso, escreva a query no arquivo
desafio31.js
32 - Retorne o nome
e a quantidade de vendas (vendidos
) dos sanduíches em que o número de vendas é múltiplo de 5
- Para isso, escreva a query no arquivo
desafio32.js