-
Utilizar o método
updateOne()
eupdateMany()
-
Utilizar os operadores
$set
,$mul
,$inc
,$min
,$max
e$currentDate
-
Renomear campos e remover campos
-
Incorporar dados aos documentos através de arrays
-
Utilizar os operadores
$pop
,$pull
e$push
-
Utilizar o operador
$addToSet
-
Utilizar os operadores
$each
,$slice
e$sort
-
Utilizar o operador
$all
para filtrar documentos -
Utilizar o operador
$elemMatch
para filtrar documentos -
Utilizar o operador
$size
para filtrar documentos pelo tamanho de arrays -
Utilizar o operador
$expr
para criar expressões de agregação -
Utilizar expressões regulares e o operador
$regex
para buscar documentos -
Utilizar o índice textual e o operador
$text
-
Utilizar o operador
$mod
- Clone o repositório
git clone git@github.com:AndersonSilva94/project-commerce.git
.- Entre na pasta do repositório que você acabou de clonar:
cd project-commerce
- Instale as dependências
npm install
Hoje você fará um projeto com o codinome commerce. Neste projeto, você praticará todos os conceitos de MongoDB já ensinados até aqui.
Para este projeto, escolhemos um dataset bem menor do que o dataFlights, mas isso não vai impedir que você aplique tudo o que viu até aqui, combinando os conhecimentos deste bloco e do anterior.
A ideia é 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.
Temos, neste projeto, uma série de desafios com diferentes níveis de complexidade. Cada desafio deve ser resolvido em seu arquivo próprio.
-
Leia a pergunta e crie no diretório
challenges
um arquivo chamadodesafioN.js
, em que N é o número do desafio. -
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.produtos.find();
⚠️ 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 commerce
, haja visto que os testes já se conectam automaticamente à basecommerce
.
-
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.
Devido ao fato de as configurações das regras do ESLint
dos projetos de front e back serem diferentes, é preciso executar o ESLint
em cada projeto.
Você pode também instalar o plugin do ESLint
no VSCode
, bastar ir em extensions e baixar o plugin ESLint
.
-
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).
-
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. -
Na raiz do diretório do projeto, execute o seguinte comando que fará a restauração da 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
, se atente a salvar seu progresso nos arquivos de desafio!
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 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úmedo do desafio
./scripts/evaluate.sh desafioN
commerce
é restaurado de um teste para outro, se atente a fazer uso do banco restaurado na hora de fazer um desafio.
Para garantir a qualidade do código, vamos utilizar neste projeto 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! Para rodar o linter localmente no projeto, execute o comando abaixo:
npm run lint
⚠ PULL REQUESTS COM ISSUES DE LINTER NÃO SERÃO AVALIADAS. ATENTE-SE PARA RESOLVÊ-LAS ANTES DE FINALIZAR O DESENVOLVIMENTO! ⚠
Aqui encontram-se os requisitos do projeto. Em cada requisito você encontrara uma imagem de um protótipo de como sua aplicação deve ficar. Estilo da página não será avaliado.
1 - Inclua o campo criadoPor
em todos os documentos, colocando "Ronald McDonald"
no valor desse campo.
Para isso, escreva no arquivo desafio1.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.
2 - Inclua o campo valorUnitario
em todos os documentos em que esse campo não existe e atribua a ele o valor "0.00"
, com o tipo NumberDecimal
.
Para isso, escreva no arquivo desafio2.js
duas queries, nesta ordem:
-
Crie uma query que adicione o campo
valorUnitario
em todos os documentos em que esse campo não existe e atribua a ele o valor"0.00"
, com o tipoNumberDecimal
. -
Crie uma query que retorne o
nome
evalorUnitario
de todos os produtos.
Para isso, escreva no arquivo desafio3.js
quatro queries, nesta ordem:
-
Crie uma query que inclua o campo
avaliacao
do tipoNumberInt
e 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
. 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 desafio4.js
duas queries, nesta ordem:
-
Crie uma query que atribua a data corrente ao campo
ultimaModificacao
no sanduícheBig Mac
. Para a data corrente faça uso do tipoDate
. -
Crie uma query que retorne o
nome
de todos os documentos em que o campoultimaModificacao
existe.
5 - 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 desafio5.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.
Para isso, escreva no arquivo desafio6.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 desafio7.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 desafio8.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 desafio9.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 desafio10.js
quatro queries, nesta ordem:
- Crie uma query que inclua um array com sete posições em todos os sanduíches. Cada uma delas representará um dia da semana, e cada posição iniciará em
0
. O array deve se parecer como 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 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
epão
aos sábados em120
. -
Crie uma query que retorne o
nome
evendasPorDia
de todos os documentos.
11 - Insira os elementos combo
e tasty
no array tags
de todos os sanduíches e aproveite para deixar os elementos em ordem alfabética ascendente.
Para isso, escreva no arquivo desafio11.js
duas queries, nesta ordem:
-
Crie uma query que faça tanto a inserção dos elementos
combo
etasty
no arraytags
de todos os sanduíches quanto a ordenação dos elementos detags
em ordem alfabética ascendente. -
Crie uma query que retorne o
nome
etags
de todos os documentos.
12 - Ordene em todos os documentos os elementos do array valoresNutricionais
pelo campo percentual
de forma descendente.
Para isso, escreva no arquivo desafio12.js
duas queries, nesta ordem:
-
Crie uma query que faça em todos os documentos a ordenação dos elementos do array
valoresNutricionais
pelo campopercentual
de forma descendente. Dica: mesmo sem adicionar nenhum novo elemento, para essa operação é necessário utilizar também o modificador$each
. -
Crie uma query que retorne o
nome
evaloresNutricionais
de todos os documentos.
13 - Adicione o elemento 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 desafio13.js
duas queries, nesta ordem:
-
Crie uma query que faça a adição do elemento
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.
14 - Adicione o elemento 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 desafio14.js
duas queries, nesta ordem:
-
Crie uma query que faça a adição do elemento
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 no arquivo desafio17.js
duas queries, nesta ordem:
-
Crie uma query que faça a criação de um índice do tipo
text
no campodescricao
com o idioma padrãoportuguese
. -
Crie uma query que retorne a quantidade de documentos que contêm as palavras
frango
ehamburguer
utilizando o operador$text
.
Para isso, escreva no arquivo desafio18.js
duas queries, nesta ordem:
-
Crie uma query que faça a criação de um índice do tipo
text
no campodescricao
com o idioma padrãoportuguese
. -
Crie uma query que retorne a quantidade de documentos que contêm a expressão
feito com
utilizando o operador$text
.
Para isso, escreva no arquivo desafio19.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
,descricao
edescricaoSite
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 campo
curtidas
do itemBig Mac
. -
Crie uma query que retorne o
nome
ecurtidas
de todos os documentos.
21 - Retorne o nome
dos sanduíches em que o número de curtidas
é maior que o número de sanduíches vendidos
.
22 - Retorne o nome
e a quantidade de vendas (vendidos
) dos sanduíches em que o número de vendas é múltiplo de 5
.
⌨️ com 💜 por Anderson Silva (Andy) 😊