Buscar

Aula-02 - MEAN Stack - parte III - b (1)

Prévia do material em texto

MEAN Stack
Parte III - Mongoose
Revisão
• Databases, Collections e Document
– 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.
Coleção
Coleção
Coleção
Documento
Revisão
• 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)
Revisão
• Operação de Leitura
– As operações de leitura recuperam documentos de uma 
coleção
• ou seja, consulta uma coleção para “pegar” os documentos.
Banco 
“myDBuser”
Coleção 
“users”
Seleciona o campo “age” cujo
valor seja maior ou igual 18
(Comparison Query Operators)
Apresenta o “name” e o 
“address” como resultado da 
consulta
Revisão
• 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”
Revisão
• 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”
• s
Revisão
Mongoose
• Blz... 
– Nós já temos o nosso MongoDB server OK 
• E já “brincamos” um pouco com os seus comandos…
– Agora podemos trabalhar diretamente com o MongoDB 
junto com o Node.js
– Para isso precisamos instalar e conversar sobre um novo 
recurso que vai “ajudar a nossa vida”.. 
Usando o Mongoose para trabalhar com 
Dados e Modelos
• Mas que raios é “Mongoose”
– É mais do que um simples “MongoDB client”
– É um pacote que também nos permite definir 
“schemas” e modelos
• Por exemplo, o que um “Usuário” deve ter definido:
– Nome : String
– Idade: Inteiro
– etc..
– E criar objetos a partir desse modelo
• E uma vez criado é possível executar métodos na database, tais 
como “save” ou “delete”
• De forma que não e necessário escrever “queries na mão”
Usando o Mongoose para trabalhar com 
Dados e Modelos
• Mas que raios é “Mongoose”
– Também é possível realizar validações extras
• Por exemplo, se o dado criado “se encaixa” no modelo criado
– Oferece operações intuitivas para manipulação da base 
de dados
Preparando o Projeto
• Para usá-lo, precisamos instalar o Mongoose no 
nosso projeto
• Vamos fazer isso usando o “npm install –save
mongoose”
– O “save” vai atualizar o nosso arquivo “package.json”
Preparando o Projeto
• Uma vez que o processo de instalação tenha 
terminado
• Podemos ver no “package.json” se ele foi 
adicionado ao projeto
• Como vamos usá-lo..
Usando Mongoose com Node.js
• Objetivo: Nós vamos conectar nosso “MongoDB
Server” à “aplicação Node.js” usando o “pacote 
Mongoose”
• Vamos começar pelo arquivo “app.js da raiz” 
– Uma vez que queremos que requisições possam se 
conectar ao banco
Usando Mongoose com Node.js
• Com o intuito de conectar as requisições, devemos 
usar:
• Com essa função nós estabelecemos uma conexão
• Como parâmetro nós temos
– O “path:port” que é o caminho para o “MongoDB Server”
– O nome da base de dados que iremos usar.
Criando Modelos com Mongoose
• Agora podemos executar operações na base de 
dados
– Mas para isso, temos que inicialmente trabalhar com os
“modelos”
– E com esses modelos, criar objetos baseados neles…
– Para finalmente usar esses objetos e acessar a base de 
dados diretamente….
• E o legal dessa estória é que… 
– o Mongoose irá criar as coleções apropriadas para nosso
modelo e gerenciar nossos dados lá…
Criando Modelos com Mongoose
• Do lado do servidor vamos criar uma
pasta “models” 
• Dentro dele, vamos criar dois
modelos que vamos usar várias vezes
ao longo do curso
– Vamos criar dois arquivos: “message.js” 
e “user.js”
Criando Modelos com Mongoose
• Reforçando…
– Nosso foco é criar uma aplicação que tem “Message” e 
“User” que podem criar mensagens, logar, deslogar, etc..
• Logo precisamos ser capaz de manipular e armazenar
mensagens e usuários
User Message*1
• Um “User” pode ter várias “Message” 
MAS
• Cada “Message” só pode ter sido criada por um “User”
Criando Modelos com Mongoose
• Agora como vamos criar os modelos com o 
Mongoose??
• Precisamos 
“importar” o 
Mongoose para 
o arquivo
• Com isso temos 
acesso a ele
• Agora vamos criar uma variável “Schema” a 
partir de “objeto Schema” do Mongoose
• “Schema” é basicamente um “helper
object” que permite criar um “projeto” do 
meu modelo (design)
• A partir desse 
“Schema” eu 
posso criar o 
“meu próprio 
schema” e 
configurá-lo
• O construtor irá 
receber como 
argumento o 
modelo que 
iremos definir
Criando Modelos com Mongoose
• Agora como vamos criar os modelos 
com o Mongoose??
• Estes são os nomes dos 
campos (“as
propriedades”) que serão 
armazenados no MongoDB
• Estas são as definições 
dos campos 
(configurações)
• A sintaxe é do Mongoose
• O “required” quer dizer 
que tal campo nunca 
pode ser vazio
• “Schema.Types” acessa 
todos os tipos que o 
Mongoose conhece
• “ObjectId” é o tipo 
interno que o Mongoose
usa para referenciar o ID
• O objeto “Message” terá
• O “content” como 
“String”
• O “user” como “uma 
referência” ao objeto 
usuário que criou a 
mensagem
• Essa referência é 
modelado como 
um “ObjectId”
Aqui vamos ter o “documents” esquematizado
Criando Modelos com Mongoose
• Agora que temos um “schema/projeto” podemos 
efetivar a criação do “modelo”
– A gente não pode instanciar esse “schema/projeto”
– A gente precisa de um “modelo” para fazer isso
• Vamos exportar 
o modelo por 
meio do 
Mongoose
• O método “model()” tem 2 argumentos:
• O nome do modelo
• O “schema” que queremos usar para o 
modelo
• O “nome do modelo” é o que será utilizado 
para criar uma “Collection” no MongoDB
• Em minúsculo e no plural: “messages”
• Com esse comando 
nosso modelo 
“Message” está 
configurado e 
poderemos 
instancia-lo mais 
pra frente
Criando Modelos com Mongoose
• O modelo para “User” seria:
• O objeto “User” terá
• O “firstName, lastName, 
password, email” como 
“String”
• O “messages” como “um 
array de referências” aos 
objetos mensagem que 
foram criadas pelo 
usuário
• Essa referência é 
modelado como um 
“ObjectId”
• O “nome do modelo” é o que será 
utilizado para criar uma “Collection” no 
MongoDB
• Em minúsculo e no plural: “users”
• Com esse comando 
nosso modelo “User” 
está configurado e 
poderemos instancia-
lo mais pra frente
Criando Modelos com Mongoose
• Antes de mais nada.. Uma palavrinha sobre o 
“unique”
• Queremos que o e-mail seja “único”
• E apesar de ser uma propriedade reconhecida pelo 
Mongoose ela não é automaticamente validada 
– Pode acontecer de ter várias e-mails iguais cadastrados
Criando Modelos com Mongoose
• Para resolver isso, precisamos instalar uma “pacote” 
com “npm install --save mongoose-unique-
validator” no nosso projeto
• E para usar no programa precisamos:
• Acessar, por meio de “schema”, 
o “método plugin” que 
permite anexar um plugin no 
“nosso schema”
• Importar o pacote
• É o “plug” 
que 
vamos 
utilizar
Criando Modelos com Mongoose
• Falta só mais “uma coisa”..
• Precisamos dizer para o Mongoose como ele vai 
efetivar a relação entre “User” e “Message”
• Como ele vai efetivamente “amarrar os dois 
modelos”
Criando Modelos com Mongoose
• Para resolver isso temosque usar outro propriedade de 
configuração. O “ref”
• “ref” diz para o Mongoose que o 
campo tem uma conexão com 
outro modelo.
• Temos que passar o “nome do 
modelo” que queremos associar
Armazenando Dados no Banco
• Agora vamos “salvar” os dados do 
“User” no MongoDB
• Para o exemplo, vamos fazer algumas
modificações na view do servidor: 
“node.hbs”
• E no “app.js de routes”
Armazenando Dados no Banco
• O campo de texto vai conter o “email”
• Este é o valor que vamos obter para 
salvar no banco
• Rota que vamos criar 
para enviar o 
formulário via “post”
• Vale lembrar o nome do banco 
que iremos utilizar
Armazenando Dados no Banco
• xxxx
• Rota via get que renderiza
a página “node.hbs”
• Recupera o valor digitado no 
formulário no campo “emailBody”
• A variável “User” permite 
importar o nosso modelo para 
ser instanciado posteriormente
• Instância um objeto baseado no 
modelo “User” e preenche com dados
• Uma vez que já temos um 
objeto criado, baseado no 
nosso modelo “User”, e 
populado, podemos usar 
“save()” do Mongoose
para salvar os dados do 
usuário no banco
Armazenando Dados no Banco
• xxxx
Armazenando Dados no Banco
• xxxx
Dica
• Para visualizar as transações (F12)
Armazenando Dados no Banco
Dica
• Ferramenta para ajudar a analisar 
requisições, seja GET, POST, etc...
Armazenando Dados no Banco
• xxxx
Dica
• Ferramenta para ajudar a analisar 
requisições, seja GET, POST, etc...
Buscando Dados no Banco
• Agora vamos “buscar” os dados do 
“User” no MongoDB
• Para o exemplo, vamos fazer algumas
modificações na view do servidor: 
“node.hbs”
• E no “app.js de routes”
Buscando Dados no Banco
• Este são os campos que terão os valores 
que vamos recuperar do banco
• Vamos “imprimir” o resultado com 
“{{ }}”
• Vale lembrar o nome do banco 
que iremos utilizar
Buscando Dados no Banco
• Rota de busca via get que 
renderiza a página “node.hbs”
• A variável “User” permite importar o nosso 
modelo. Ela representa o nosso modelo de 
usuário – “user.js”
• Permite renderizar a página 
“node.hbs” passando como 
valor para o parâmetro 
“firstNameV” o documento 
recuperado
• Caso ocorra algum 
erro, um simples 
texto é enviado. Caso 
contrário, renderiza a 
página 
• Vamos chamar o método 
“findOne()” de “User” com 
os seguintes argumentos:
• Um filtro, que define o 
critério de busca”. 
Neste caso é o primeiro 
registro que encontrar, 
sem critério “{ }”
• Uma “função callback” 
que nos retorna um 
erro (“err”), caso 
ocorra, e o “documents
recuperado” 
(“documents”)
Buscando Dados no Banco
• Reparem que foi retornado todo o 
“document” em uma única 
representação
• Como se fosse um único objeto
• Logo precisamos fazer uma alteração 
no “app.js de routes”
Buscando Dados no Banco
• A variável “User” permite 
importar o nosso modelo
• Vamos extrair do “documents” 
recuperado cada um dos campos do 
modelo
Buscando Dados no Banco
Buscando Dados no Banco
• Alguns outros exemplos:
Dica:
• Use qualquer método para buscar dados no banco diretamente via o modelo
• E use o método com callback, incluindo a resposta renderizada
• Se você executar qualquer código fora do callback você não terá acesso aos 
dados recuperados porque ele não estará mais lá...
Para se aprofundar bastante no assunto
• Mongoose Docs:
– http://mongoosejs.com/docs/guide.html
Atividades
• Para fechar
– Vamos criar um novo modelo para ser usado em uma página de 
registro de usuário
• Crie um novo arquivo CSS na estrutura
– styleregister.css
• Crie um template “registro-usuario-salvar.hbs” 
– Use como exemplo o “index.hbs” para pegar os imports do bootstrap além do CSS e 
a estrutura base do HTML
• Coloque o código HTML de um “registro de dados” (register-parteI.txt)
• Acesse esse template pela rota “localhost/registro-usuario-salvar”
– Crie um novo modelo com os dados solicitados no registro
– Agora ao registrar, 
• Redirecione para uma nova página template “registro-usuario-
consultar.hbs” 
• E recupere e mostre os dados persistido.
Atividades
• IMAGENS...
Atividades
• Dado a base de dados abaixo (vc pode criar a sua tb), 
construa uma página que:
– Recupere os dados a partir do email fornecido. (O filtro é o e-mail)
– E que a rota tenha esse email como “Request Params”
• Dicas:

Mais conteúdos dessa disciplina