Prévia do material em texto
MEAN Stack Parte III – MongoDB Revisão • MEAN Stack – MEAN é usado para denotar uma stack completa para desenvolvimento de aplicações incluindo MongoDB, Express, Angular e Node.js Revisão Entendendo o Fluxo de uma Requisição • Quando usamos o “npm start” Entendendo o Fluxo de uma Requisição • O arquivo “bin/www” • Os pontos a serem destacados aqui são o porto definido para listen e a função createServer Revisão Entendendo o Fluxo de uma Requisição • No createServer passamos como argumento o “app.js” • Ele é o arquivo principal que configura e starta o Express no servidor • Cada requisição que chega no servidor passa por esse arquivo – o “app.js do projeto” Revisão Entendendo o Fluxo de uma Requisição • O legal de usar o Express é que ele nos oferece algumas facilidades de configuração do servidor • A variável “app” irá nos oferecer esses recursos Revisão Entendendo o Fluxo de uma Requisição • Essa linha é muito importante porque ela encaminha, neste caso já que o path é apenas “/”, qualquer requisição para a variável “appRouter” que tem as rotas definidas no arquivo “app.js” de “routes” • Resumindo, esse comando encaminha a requisição para este arquivo “/routes/app.js” Revisão Entendendo o Fluxo de uma Requisição • Neste caso, possui apenas uma rota registrada que lida com o caso “/” ou seja, “localhost/” e nada mais. Qualquer outra coisa tipo “/message” não será tratado por esta rota • Essa rota encaminha para “index.hbs” que está no diretório “views” Revisão Trabalhando com Request e Response • Aqui usamos o Router do Express • É onde podemos definir rotas para o servidor usando os métodos do HTTP, tais como GET, POST, PUT, DELETE, por exemplo. Neste caso estamos usando o método GET. Revisão Trabalhando com Request e Response • Estamos criando uma nova rota, a “/message” e criando uma nova view no diretório “views” Revisão Trabalhando com Request e Response • Podemos usar a “sintaxe do template”para “imprimir/apresentar” alguns dados. • De forma geral, podemos imprimir dados com handlebars usando “duplas chaves” – {{}} • Entre as chaves podemos usar qualquer variável JavaScript que for passada para a view Revisão • Usamos este “tipo de requisição” quando queremos “pegar um recurso” • Deve-se usá-lo para esse fim • Este “tipo de requisição” deve ser usado quando queremos “enviar algum dado para o servidor para armazenar lá” • Se você quer “criar um recurso no servidor” • Este “tipo de requisição” deve ser usado quando queremos “mudar alguma coisa (algum recurso) que já existe no servidor” • Aqui a ideia é “fazer um update da parte” e não substituir o todo Tipos de Métodos HTTP Revisão • Usamos este “tipo de requisição” quando queremos “substituir alguma coisa (um recurso) que já existe no serviro” • Aqui a ideia é “fazer um replace do todo” e não apenas mudar uma parte • Este “tipo de requisição” deve ser usado quando queremos “apagar algum recurso que esteja no servidor” Tipos de Métodos HTTP Revisão Formato dos Dados - Request e Response • Com um “post request”, por exemplo, nós podemos armazenar dados no “body”, que também é parte da “request”. Formato dos Dados - Request e Response • Também podemos pegar “as coisas” que estamos vendo na URL, por meio do “Request Params” e do “Request Query” . • O “Request Params” são codificados em um lugar específico na URL pois é “hard-encoded” com o “ : ” na URL na implementação • O “Request Query” por sua vez aparece após o “ ? “ • Tem a estrutura sintática “chave = valor” MongoDB • Blz... Agora vamos... – Vamos “brincar” um pouco com o MongoDB.. – Uma vez que é uma escolha bastante utilizada no mercado para aplicações com Angular e Node.js/Express – É importante ressaltar que qualquer outro banco pode ser utilizado – Pra começar.. Um pensamento.. MongoDB • Uma dúvida comum em relação ao MongoDB é sobre a modelagem e relacionamento. – MongoDB é considerado um banco de dados não relacional, • Não é necessário fazer uma espécie de “CREATE TABLE” para começar inserir dados. – E quanto relacionar um registro com outro? • Bom, para isso é necessário pensar de forma não relacional • Vamos conversar sobre isso.. Mas antes… Preparando o Projeto • O que precisamos fazer: • Vamos por partes... • Precisamos instalar na nossa máquina • Para isso devemos • Fazer o download em https://www.mongodb. com/ • Extrair ele e mover o diretório • Ou usar o installer • Depois nós precisamos “levantar” o banco (MongoDB Server) a fim de executar operações no nele • E finalmente precisamos ter um “cliente” para interagir com o banco • No cliente é que iremos “dar o comados” tipo “salvar algo.”, “pegar algo” • Apesar de termos um cliente simples instalado junto com o MongoDB, o que vamos normalmente fazer é usar a nossa aplicação em Node.js para interagir com ele https://www.mongodb.com/ https://www.mongodb.com/ https://www.mongodb.com/ Preparando o Projeto • O que precisamos fazer inicialmente: – É preciso instalar o MongoDB (https://www.mongodb.com) https://www.mongodb.com/ https://www.mongodb.com/ https://www.mongodb.com/ Preparando o Projeto • O que precisamos fazer inicialmente: – É preciso criar o diretório de dados do banco • É aonde nossos dados irão ser armazenados – Por padrão é o “\data\db” do driver aonde o banco foi instalado. – Mas vamos criar ele dentro do nosso projeto Etapa muito importante Preparando o Projeto • O que precisamos fazer inicialmente – Vamos iniciar o banco com o comando “mongod”... • IMPORTANTE: – Como não estamos usando o path padrão, precisamos especificar o path alternativo dos arquivos de dados passando a opção “--dbpath” para o executável. – Também dá para fazer isso em um arquivo de configuração Preparando o Projeto • O que precisamos fazer inicialmente: – Antes de conectar o Node.js nele, vamos fazer alguns testes para ver se está tudo ok.. – Com o “banco levantado” (executando) nós podemos trabalhar nele usando o “MongoDB Shell Client” – Vamos nos conectar no banco com o comando “mongo” “mongod” => Server “mongo” => Client Databases, Collections e Document • Uma vez Ok.. Precisamos entender o seguinte conceito: – MongoDB não tem tabelas. O banco possui “collections of documents” (coleções de documentos) • As coleções são análogas a tabelas em bancos de dados relacionais e os documentos aos dados. – Para selecionar uma base de dados a ser usado, use a instrução “use <my_db>” no Shell Client Coleção Coleção Coleção Documento Databases, Collections e Document • Criando um Database e Collections – Se um banco de dados não existir, o MongoDB cria o banco de dados quando se armazena os dados para ele pela primeira vez. (ou seja, quando se cria um coleção com seu documento) – Podemos mudar para um banco de dados inexistente e executar a seguinte operação use myBDuser Banco “myDBuser” Coleção “users” Documento (dados) Databases, Collections e Document • Criando um Database e Collections (Operação de Escrita) Databases, Collections e Document • Inserindo Um ou Vários Documents (Operação de Escrita) – Posso inserir um novo documento, por exemplo, em uma coleção já existente Databases, Collections e Document • Inserindo Um ou Vários Documents (Operação de Escrita) – Ou posso inserir vários documentos ao mesmo tempo • Neste exemplo, estou criando também um novo collection Databases, Collections e Document • Operação de Leitura – As operaçõesde leitura recuperam documentos de uma coleção • ou seja, consulta uma coleção para “pegar” os documentos. Banco “myDBuser” Coleção “users” Apresenta o “name” e o “address” como resultado da consulta Seleciona o campo “age” cujo valor seja maior ou igual 18 (Comparison Query Operators) Databases, Collections e Document • Operação de Leitura Databases, Collections e Document • Operação de Leitura https://docs.mongodb.com/manual/reference/opera tor/query/#query-selectors (Query Operators) https://docs.mongodb.com/manual/reference/operator/query/#query-selectors https://docs.mongodb.com/manual/reference/operator/query/#query-selectors https://docs.mongodb.com/manual/reference/operator/query/#query-selectors https://docs.mongodb.com/manual/reference/operator/query/#query-selectors Databases, Collections e Document • Operação de Leitura Databases, Collections e Document • Operação de Leitura Dica Databases, Collections e Document • Operação de Leitura - Arrays – Consulta todos os documentos onde “tags” é um array que contém a string "red" como um dos seus elementos: – Consulta todos os documentos onde o array “dim_cm” contém pelo menos um elemento cujo valor seja superior a 25 Databases, Collections e Document • Operação de Leitura - Arrays Databases, Collections e Document • Operação de Update – As operações de atualização modificam os documentos existentes em uma coleção . • No MongoDB, as operações de update visam uma única coleção. • Todas as operações de escrita no MongoDB são atômicas no nível de um único documento. Coleção “users” Determina o critério de busca do elemento a ser atualizado. Neste caso, “age” menor que “18” Seleciona o campo “status” cujo valor será atualizado Banco “myDBuser” Databases, Collections e Document • Operação de Update Databases, Collections e Document • Operação de Delete – As operações de delete remove documentos de uma coleção. • No MongoDB, as operações de delete visam uma única coleção. • Todas as operações de escrita no MongoDB são atômicas no nível de um único documento. Banco “myDBuser” Coleção “users” Determina o critério de deleção Neste caso, “status” igual a “reject” Databases, Collections e Document • Operação de Delete s Databases, Collections e Document Databases, Collections e Document • s Databases, Collections e Document Databases, Collections e Document Databases, Collections e Document • Vamos supor agora o seguinte exemplo: – Uma aplicação de Escola, com uma coleção de alunos e uma coleção de biblioteca, sendo que essa aplicação deve fazer o controle de aluguel dos livros aos seus alunos – Pensando de forma relacional teríamos pelo menos três tabelas: alunos, livros e aluguel, • onde a tabela de aluguel possui – o id do aluno que retirou, – o id do livro retirado – e outros campos complementares. E no MongoDB? Databases, Collections e Document • Seja a coleção de alunos: “tabela” alunos (coleção) Databases, Collections e Document • Seja a coleção de livros: “tabela” livros (coleção) “tabela” aluguel tem que ser pensada de forma um pouco diferente (agrupamento) Databases, Collections e Document • Controlando empréstimo de livros – O objetivo é : Como fazer no MongoDB o controle de alugueis (empréstimos) de livros para os alunos? – Uma abordagem para a modelagem seria pensar a melhor maneira de extrair a maior quantidade de informações em um único find(). – Como o objeto de interesse é controle de livros, então a coleção de livros é que será modificada para agregar as funções de alugueis, Databases, Collections e Document • Controlando empréstimo de livros – Vamos supor o seguinte cenário: • A aluna Carolina Alves retirou o livro O Príncipe por 5 dias. – Para fazer esse controle, vamos adicionar à coleção “livros” uma chave chamada “aluguel”, composta de múltiplos valores. – Desta forma, todos os livros alugados terão a chave aluguel • Que é composta de valores que podem ser adicionados de acordo com cada necessidade. Databases, Collections e Document • Controlando empréstimo de livros • Adicionar à coleção “livros” uma chave chamada “aluguel” • Desta forma, todos os livros alugados terão a chave aluguel Databases, Collections e Document • Controlando empréstimo de livros – Dessa forma a consulta por todos os livros alugados seria: – E os livros disponíveis na biblioteca (não alugados) seria: Databases, Collections e Document • Controlando empréstimo de livros – Seguindo essa lógica, assim que a aluna devolver o livro, basta remover a chave “aluguel” da coleção livro • Que o mesmo volta a ficar como disponível na biblioteca. – Também o conteúdo da chave aluguel pode ser movida para outra chave como por exemplo, historicoalugueis, • Dessa maneira mantém um histórico de quem foram os alunos que fizeram retiradas, • Assim também gerar estatísticas de tempo médio de retirada, quais foram os livros mais retirados, quem pagou multa, quais alunos mais retiram livros, etc. Databases, Collections e Document • Outras perguntas – Qual o livro que o usuário “carolina.alves” alugou? – Qual a data de entrega do livro “O Principe” alugado pelo usuário “carolina.alves”. Databases, Collections e Document • Obter todas as informações do aluno que está com o livro “O Principe” – Pela lógica eu preciso fazer um find() em livros, pegar o ID do aluno, e outro find() em alunos. • Para entender melhor… – O método find() retorna um “cursor” para os resultados. – É preciso usar o método “next()” para acessar o documento. – Execute os comando abaixo no shell…. Para se aprofundar bastante no assunto • Official MongoDB Page: – https://www.mongodb.com/ • Setup Instructions on Official Page (choose your OS): – https://docs.mongodb.com/manual/administration/inst all-community/ Atividades • Para fechar – Insira novos alugueis para cada aluno da base de dados Atividades • Para fechar – Faça novas consultar para recuperar os novos dados cadastrados – Atualize o NOME de um usuário – Atualize o TITULO de um livro – Apague um ALUGUEL realizado Atividades • Para fechar – Atualize um documets para que permita que um livro tenha um “array de alugueis” • A ideia seria indicar que o livro tem vários empréstimos ao mesmo tempo, simulando que mais de um na escola Anexo MongoDB e Join - $lookup • É muito comum dúvida sobre joins — como fazer “relacionamento” em bancos não relacionais — e juntar informações de duas coleções diferentes. • Pode-se usar o operador de agregação $lookup que nada mais é do que o left join do SQL. • Esse operador realiza a busca em duas coleções diferentes e agrega os documentos que possuem o mesmo identificador MongoDB e Join - $lookup • Preparando o cenário: Levantando o banco MongoDB e Join - $lookup • Preparando o cenário : Populando duas coleções -> produtos e pedidos. “id” entre as coleções MongoDB e Join - $lookup • Preparando o cenário : Usando $lookup, a query de agregação fica... – A agregação é realizada na coleção de pedidos – from: indica em qual coleção a busca deve ser realizada – localField: indica qual é a chave de busca local – foreignField: indica qual a chave que deverá ser encontrada – as: indica um nome para o subdocumento que receberá esse cruzamento MongoDB e Join - $lookup • Preparando o cenário : Usando $lookup, a query de agregação fica... MongoDB e Join - $lookup • Extra....