Essa é uma projeto que simula um banco de dados MongoDB de uma lanchonete. É possível recuperar e filtrar várias informações a respeito dos produtos.
O foco desse projeto foi explorar a aplicação de queries MQL (MongoDB Query Language) para acesso e manipulação de dados em um banco não relacional (NoSQL).
O banco do projeto é populado a partir de um arquivo BSON, que gera uma coleção de documentos.
Exemplo geral do schema de um documento:
{
"_id": {
"$oid": "5f280af11532b7276329ba47"
},
"nome": "Big Mac",
"ingredientes": [
"hamburguer",
"alface",
"queijo",
"molho especial",
"cebola",
"picles",
"pão com gergelim"
],
"tags": [
"bovino",
"pão"
],
"valoresNutricionais": [
{
"tipo": "calorias",
"quantidade": 502,
"unidadeMedida": "kcal",
"percentual": 25
},
{
"tipo": "carboidratos",
"quantidade": 45,
"unidadeMedida": "gramas",
"percentual": 15
},
{
"tipo": "sódio",
"quantidade": 1047,
"unidadeMedida": "miligramas",
"percentual": 44
},
{
"tipo": "proteínas",
"quantidade": 27,
"unidadeMedida": "gramas",
"percentual": 36
},
{
"tipo": "lipídios",
"quantidade": 25,
"unidadeMedida": "gramas",
"percentual": 45
}
],
"descricao": "Não existe nada igual\nDois hambúrgures, alface, queijo, molho especial, cebola e picles num pão com gergelim",
"curtidas": 145,
"vendidos": 137
}
A partir dos dados disponíveis, foram estruturadas queries MongoDB para acesso e manipulação de dados, de acordo com os desafios explicitados abaixo:
Desafios
- Retorne a quantidade de documentos inseridos na coleção produtos
- Ordene a coleção produtos pela quantidade de lanches vendidos em ordem crescente, mostrando apenas o nome e a quantidade de lanches vendidos
- Retorne o lanche mais vendido, mostrando apenas o nome e a quantidade do lanche mais vendido
- 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
- 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
- Retorne o nome e as curtidas dos lanches que tiveram curtidas maiores que 10 e menores que 100
- 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
- Delete os lanches com menos de 50 curtidas e retorne o nome dos lanches que restaram no banco
- Retorne o nome de todos os lanches que possuam calorias abaixo de 500
- 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
- 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
- Adicione ketchup aos ingredientes para todos os sanduíches menos o McChicken, garantindo que não haja duplicidade nos ingredientes
- Inclua o campo criadoPor em todos os documentos, colocando Ronald McDonald no valor desse campo
- 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
- Adicione o campo avaliacao em todos os documentos da coleção e efetue alterações nesse campo
- Adicione o campo ultimaModificacao com a data corrente somente no sanduíche Big Mac
- Retorne a quantidade total de produtos em uma nova coleção chamada resumoProdutos
- Inclua bacon no final da lista de ingredientes dos sanduíches Big Mac e Quarteirão com Queijo
- Remova o item cebola de todos os sanduíches
- Remova o primeiro ingrediente do sanduíche Quarteirão com Queijo
- Remova o último ingrediente do sanduíche Cheddar McMelt
- Adicione a quantidade de vendas dos sanduíches por dia da semana
- 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)
- Ordene em todos os documentos os valores do array valoresNutricionais pelo campo percentual de forma decrescente
- 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
- 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
- Conte quantos produtos contém Mc no nome, sem considerar letras maiúsculas ou minúsculas
- Conte quantos produtos têm 4 ingredientes
- Renomeie o campo descricao para descricaoSite em todos os documentos
- Remova o campo curtidas do item Big Mac
- Retorne o nome dos sanduíches em que o número de curtidas é maior que o número de sanduíches vendidos
- Retorne o nome e a quantidade de vendas (vendidos) dos sanduíches em que o número de vendas é múltiplo de 5
MongoDB, MongoDB queries, Docker
Para rodar esta aplicação é necessário ter o Docker instalado em sua máquina.
- Clone o repositório e entre no diretório
git clone git@github.com:lzaghi/mongo-playground.git
cd mongo-playground
- Instale as dependências
npm install
- 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
- Acesse o terminal do container
docker exec -it nomeDoContainer bash
- Restaure o banco de dados
mongorestore -d db -c produtos ./app/assets/produtos/produtos.bson
- Aplique as queries com o comando
mongo db < ./app/challenges/desafio[n].mongodb.js
(substitua [n]
pelo número do desafio que deseja executar)
As queries podem ser encontradas nos arquivos desafio[n].mongodb.js
, na pasta challenges
, e elas também podem ser executadas diretamente no VSCode com a extensão do MongoDB.