Você está na página 1de 8

(/) Home (/) Arquivo (/arquivo/) Tags (/tags/) Mapa (/mapa/)

Nodejs e MongoDB - Introduo ao Mongoose


Mongoose (http://Mongoosejs.com/) uma biblioteca do Nodejs que proporciona uma soluo baseada em esquemas para modelar os dados da sua aplicao. Ele possui sistema de converso de tipos, validao, criao de consultas e hooks para lgica de negcios. Mongoose fornece um mapeamento de objetos do MongoDB similar ao ORM (Object Relational Mapping), ou ODM (Object Data Mapping) no caso do Mongoose. Isso significa que o Mongoose traduz os dados do banco de dados para objetos JavaScript para que possam ser utilizados por sua aplicao. Obs: Este artigo vai assumir que voc tem o Nodejs (http://nodejs.org/) e o MongoDB (http://www.mongodb.org/) instalados. Voc precisa estar com o MongoDB rodando em seu computador para poder fazer os seguintes exemplos.

Instalando o pacote Mongoose


Utilizando o NPM via linha de comando muito simples fazer a instalao dos pacotes do Nodejs. Para fazer a instalao do Mongoose, execute a seguinte linha de comando que o NPM cuidar de instalar a verso estvel mais recente do pacote requerido:
n p mi n s t a l lM o n g o o s e

Conectando com o MongoDB


Neste artigo vamos conectar o Mongoose (http://Mongoosejs.com/docs/api.html#connection_Connection) com o banco de dados de testes que o MongoDB define quando voc o inicializa pelo console e vamos garantir que qualquer erro de conexo seja impresso no console.

v a rM o n g o o s e=r e q u i r e ( ' M o n g o o s e ' ) ; v a rd b=M o n g o o s e . c o n n e c t i o n ; d b . o n ( ' e r r o r ' ,c o n s o l e . e r r o r ) ; d b . o n c e ( ' o p e n ' ,f u n c t i o n ( ){ c o n s o l e . l o g ( ' C o n e c t a d oa oM o n g o D B . ' ) / /V a m o sa d i c i o n a rn o s s o sE s q u e m a s ,M o d e l o sec o n s u l t a sa q u i } ) ; M o n g o o s e . c o n n e c t ( ' m o n g o d b : / / l o c a l h o s t / t e s t ' ) ;

Ao executar nossa aplicao de exemplo podemos observar no console do MongoDB que foram abertas 5 conexes simultneas. Isto ocorre porque o Mongoose usa um conjunto de 5 conexes simultneas por padro que so compartilhadas por toda sua aplicao. Para melhorar o desempenho das nossas aplicaes vamos deix-las abertas, porm voc pode alterar o comportamento padro adicionando parmetros opcionais ao M o n g o o s e . c o n n e c t ( ) - o parmetro p o o l S i z e define a quantidade de conexes simultneas. Veja abaixo a sada do meu MongoDB exibindo que foram abertas 5 conexes simultneas:
S a tA u g3 11 1 : 1 2 : 2 1 . 8 2 7[ i n i t a n d l i s t e n ]c o n n e c t i o na c c e p t e df r o m1 2 7 . 0 . 0 . 1 : 6 4 4 1 3# 2( 1c o n n e c t i o nn o wo p e n ) S a tA u g3 11 1 : 1 2 : 2 1 . 8 3 0[ i n i t a n d l i s t e n ]c o n n e c t i o na c c e p t e df r o m1 2 7 . 0 . 0 . 1 : 6 4 4 1 4# 3( 2c o n n e c t i o n sn o wo p e n ) S a tA u g3 11 1 : 1 2 : 2 1 . 8 3 1[ i n i t a n d l i s t e n ]c o n n e c t i o na c c e p t e df r o m1 2 7 . 0 . 0 . 1 : 6 4 4 1 5# 4( 3c o n n e c t i o n sn o wo p e n ) S a tA u g3 11 1 : 1 2 : 2 1 . 8 3 1[ i n i t a n d l i s t e n ]c o n n e c t i o na c c e p t e df r o m1 2 7 . 0 . 0 . 1 : 6 4 4 1 6# 5( 4c o n n e c t i o n sn o wo p e n ) S a tA u g3 11 1 : 1 2 : 2 1 . 8 3 2[ i n i t a n d l i s t e n ]c o n n e c t i o na c c e p t e df r o m1 2 7 . 0 . 0 . 1 : 6 4 4 1 7# 6( 5c o n n e c t i o n sn o wo p e n )

Esquemas e Modelos
Para comear vamos precisar de um esquema (http://Mongoosejs.com/docs/guide.html) e um modelo (http://Mongoosejs.com/docs/models.html) para que possamos trabalhar com os dados que sero persistidos em nosso banco de dados MongoDB. Esquemas definem a estrutura dos documentos dentro de uma coleo e modelos so usados para criar instncias de dados que sero armazenados em documentos. Ns vamos fazer um banco de dados de filmes para acompanhar os filmes que tem cenas extras aps os crditos finais (tambm chamado de credit cookies). O cdigo abaixo mostra nosso esquema m o v i e S c h e m a e nosso modelo M o v i e criado.
v a rm o v i e S c h e m a=n e wM o n g o o s e . S c h e m a ( { t i t l e :{t y p e :S t r i n g} , r a t i n g :S t r i n g , r e l e a s e Y e a r :N u m b e r , h a s C r e d i t C o o k i e :B o o l e a n } ) ; v a rM o v i e=M o n g o o s e . m o d e l ( ' M o v i e ' ,m o v i e S c h e m a ) ;

A ltima linha deste cdigo compila o modelo M o v i e utilizando o esquema m o v i e S c h e m a como estrutura. O Mongoose tambm cria uma coleo no MongoDB chamada M o v i e s para estes documentos. Voc pode notar que o modelo M o v i e est em letra maiscula, isto porque quando um modelo compilado retornado uma funo construtora que ser usada para criar as instncias do modelo. As instncias criadas pelo construtor do modelo so documentos que sero persistidos pelo MongoDB ao utilizar a funo s a v e.

Criar, Recuperar, Atualizar e Deletar (CRUD)


Criar um novo documento M o v i e fcil agora que j definimos o modelo, basta instancializar o modelo M o v i e e salvar esta instncia na base. Atualizar igualmente fcil, faa suas modificaes e ento chame a funo s a v e do seu documento.
v a rt h o r=n e wM o v i e ( { t i t l e :' T h o r ' , r a t i n g :' P G 1 3 ' , r e l e a s e Y e a r :' 2 0 1 1 ' , / /N o t eou s od eS t r i n ga oi n v e sd eN u m b e r h a s C r e d i t C o o k i e :t r u e } ) ; t h o r . s a v e ( f u n c t i o n ( e r r ,t h o r ){ i f( e r r )r e t u r nc o n s o l e . e r r o r ( e r r ) ; c o n s o l e . d i r ( t h o r ) ; } ) ;

Observe que utilizamos uma String ao invs de um Nmero no campo r e l e a s e Y e a r e o Mongoose vai se encarregar de converter o dado para tipo especificado no esquema. Quando adicionamos estes dois cdigos dados nossa aplicao e executamos vemos que a funo s a v e vai fornecer um documento recm criado, observado pelo que foi impresso no console de nossa aplicao.
{_ _ v :0 , t i t l e :' T h o r ' , r a t i n g :' P G 1 3 ' , r e l e a s e Y e a r :2 0 1 1 , h a s C r e d i t C o o k i e :t r u e , _ i d :5 2 2 2 0 1 2 c b 6 5 e d d f 0 0 3 0 0 0 0 0 1}

Colees no MongoDB possuem esquemas flexveis, isto quer dizer que colees no impem a estrutura dos documentos. Na prtica isto significa que documentos da mesma coleo no precisam ter o mesmo conjunto de campos ou estrutura, e campos comuns em documentos de uma coleo podem carregar diferentes tipos de dados. Como foi visto em nosso exemplo, utilizando o Mongoose para mapear nossa base, ele padroniza os documentos de um mesmo esquema a fim garantir que instncias do modelo que compilou aquele esquema sempre tenham o mesmo tipo de dados nos atributos especificados pelo esquema.

MongoDB tambm possui uma estrutura de dados chamada ndice (http://docs.mongodb.org/manual/core/indexes/) que permite voc localizar rpidamente documentos baseado nos valores armazenados em certos campos especficos. Fundamentalmente, ndices no MongoDB similar ndices em outros sistemas de banco de dados. Em nosso exemplo o ndice do modelo criado _ i d.

Recuperando um documento da base


Diferentes maneiras podem ser utilizadas para recuperar um documento existente na base de dados. Voc pode buscar documentos baseado em qualquer propriedade do esquema e voc pode buscar qualquer quantidade de documentos. Utilize findOne (http://Mongoosejs.com/docs/api.html#model_Model.findOne) para limitar os resultados a um nico documento.
/ /B u s c a n d ou mu n i c of i l m ep e l on o m e M o v i e . f i n d O n e ( {t i t l e :' T h o r '} ,f u n c t i o n ( e r r ,t h o r ){ i f( e r r )r e t u r nc o n s o l e . e r r o r ( e r r ) ; c o n s o l e . d i r ( t h o r ) ; } ) ; / /B u s c a n d ot o d o so sf i l m e s M o v i e . f i n d ( f u n c t i o n ( e r r ,m o v i e s ){ i f( e r r )r e t u r nc o n s o l e . e r r o r ( e r r ) ; c o n s o l e . d i r ( m o v i e s ) ; } ) ; / /B u s c a n d ot o d o so sf i l m e sq u ep o s s u e m' c r e d i tc o o k i e ' . M o v i e . f i n d ( {h a s C r e d i t C o o k i e :t r u e} ,f u n c t i o n ( e r r ,m o v i e s ){ i f( e r r )r e t u r nc o n s o l e . e r r o r ( e r r ) ; c o n s o l e . d i r ( m o v i e s ) ; } ) ;

Mongoose tambm permite voc criar funes auxiliares estticas (http://Mongoosejs.com/docs/api.html#schema_Schema-static) para buscar seus dados. Para isso voc deve atribuir sua funo esttica ao esquema antes de ser feita compilao para o modelo.
m o v i e S c h e m a . s t a t i c s . f i n d A l l W i t h C r e d i t C o o k i e s=f u n c t i o n ( c a l l b a c k ){ r e t u r nt h i s . f i n d ( {h a s C r e d i t C o o k i e :t r u e} ,c a l l b a c k ) ; } ; v a rM o v i e=M o n g o o s e . m o d e l ( ' M o v i e ' ,m o v i e S c h e m a ) ; / /U t i l i z a d n oaf u n c a oa u x i l i a re s t a t i c ad om o d e l o' M o v i e 'c o m p i l a d o M o v i e . f i n d A l l W i t h C r e d i t C o o k i e s ( f u n c t i o n ( e r r ,m o v i e s ){ i f( e r r )r e t u r nc o n s o l e . e r r o r ( e r r ) ; c o n s o l e . d i r ( m o v i e s ) ; } ) ;

Isso tudo que precisa fazer para manipular os dados em MongoDB. Mongoose faz esta tarefa muito simples ento voc pode desenvolver seus servios rapidamente. Usando isso junto com suas habilidades com Express, voc pode desenvolver um aplicativo web muito bom e funcional. Abaixo est um cdigo utilizando os conceitos aqui apresentados que implementa a funo auxiliar esttica, para buscar todos filmes com credit cookies, salva 3 filmes do Thor com credit cookies e em seguida cria um T i m e o u t para buscar os filmes utilizando a funo auxiliar 1 segundo depois - Isto feito pois como estamos trabalhando com IO no bloqueante o Node no aguarda o tempo de salvar os filmes antes de prosseguir, por isso damos um tempo para se certificar que eles foram salvos antes de busc-los.
v a rM o n g o o s e=r e q u i r e ( ' M o n g o o s e ' ) ; v a rd b=M o n g o o s e . c o n n e c t i o n ; d b . o n ( ' e r r o r ' ,c o n s o l e . e r r o r ) ; d b . o n c e ( ' o p e n ' ,f u n c t i o n ( ){ / /C r e a t ey o u rs c h e m a sa n dm o d e l sh e r e . c o n s o l e . l o g ( ' C o n e c t a d o . ' )

v a rm o v i e S c h e m a=n e wM o n g o o s e . S c h e m a ( { t i t l e :{t y p e :S t r i n g} , r a t i n g :S t r i n g , r e l e a s e Y e a r :N u m b e r , h a s C r e d i t C o o k i e :B o o l e a n } ) ;

m o v i e S c h e m a . s t a t i c s . f i n d A l l W i t h C r e d i t C o o k i e s=f u n c t i o n ( c a l l b a c k ){ r e t u r nt h i s . f i n d ( {h a s C r e d i t C o o k i e :t r u e} ,c a l l b a c k ) ; } ; v a rM o v i e=M o n g o o s e . m o d e l ( ' M o v i e ' ,m o v i e S c h e m a ) ;

f o r( v a ri= 1 ;i < = 3 ;i + + ) { v a rt h o r=n e wM o v i e ( { t i t l e :' T h o r'+i , r a t i n g :' P G 1 3 ' , r e l e a s e Y e a r :' 2 0 1 1 ' , / /N o t eou s od eS t r i n ga oi n v e sd eN u m b e r h a s C r e d i t C o o k i e :t r u e } ) ; t h o r . s a v e ( f u n c t i o n ( e r r ,t h o r ){ i f( e r r )r e t u r nc o n s o l e . e r r o r ( e r r ) ; c o n s o l e . l o g ( ' S a l v o :' ) c o n s o l e . d i r ( t h o r ) ; } ) ; }

s e t T i m e o u t ( f u n c t i o n ( ) { / /U t i l i z a d n oaf u n c a oa u x i l i a re s t a t i c ad om o d e l o' M o v i e 'c o m p i l a d o M o v i e . f i n d A l l W i t h C r e d i t C o o k i e s ( f u n c t i o n ( e r r ,m o v i e s ){ i f( e r r )r e t u r nc o n s o l e . e r r o r ( e r r ) ; c o n s o l e . l o g ( ' B u s c a d o :' ) c o n s o l e . d i r ( m o v i e s ) ; } ) ; } ,1 0 0 0 ) ; } ) ; M o n g o o s e . c o n n e c t ( ' m o n g o d b : / / l o c a l h o s t / t e s t ' ) ;

Anterior (/livro-aplicacoes-web-real-time-com-node-js/) Prximo

Arquivo (/arquivo/)

(/mineracao-de-dados-e-as-funcoes-map-reduce-filter/)

8 Comentrios
Ordenar por Melhor

NodeBR
Partilhar

Autenticar
Favorito

Participar no debate
Thyago Luciano 3

4 meses atrs

Faltou so Colocar os creditos ( http://blog.modulus.io/getting... )


Responder Partilhar

Jeferson Viana Perito

2 meses atrs

Acho que uma forma mais robusta de aguardar o fim da execuo dos saves seria utilizar promises ao invs de colocar o timeout hehehe, belo post! Parabns
Responder Partilhar

Eduardo Matos

7 meses atrs

Bacana cara, bom post pra quem t comeando! =D


Responder Partilhar

Rafael Henrique Moreira

Eduardo Matos 7 meses atrs

Obrigado Eduardo, A inteno essa mesmo, mostrar para os novatos como fcil e divertido subir aplicaes utilizando Node no back-end.
1 Uli Oreggia

Responder Partilhar

7 meses atrs

Muito bom mesmo! Estava com dificuldade de compreender o funcionamento do Mongoose e esse post resolveu
Responder Partilhar

Rafael Henrique Moreira

Uli Oreggia 7 meses atrs

Obrigado Uli Oreggia. A ideia fortalecer cada vez mais comunidade brasileira de Nodejs. Full-stack JavaScript e Single Page Apps so o futuro da web, e o Nodejs faz parte desse futuro. As aplicaes web vo se parecer cada vez mais com as aplicaes desktop.
1
Responder Partilhar

Caio Ribeiro Pereira

7 meses atrs

Post excelente! Parabns!


Responder Partilhar

Rafael Henrique Moreira

Caio Ribeiro Pereira 7 meses atrs

Obrigado Caio, voc sabe que voc uma grande inspirao para mim. =)
Responder Partilhar

Publicado em

31 de Agosto de 2013

Tags
dica 3 (/tags/#dica)

Autor (mailto:rafadev7@gmail.com) (https://twitter.com/rafadev7)


Rafael Henrique Moreira

(http://rafadev.com/)

(https://github.com/rafadev7)

Posts relacionados
Livro - Aplicaes web real-time com Node.js (/livro-aplicacoes-web-real-time-com-node-js/) Minerao de dados e as funes map, reduce e filter (/mineracao-de-dados-e-as-funcoes-map-reducefilter/) Como evitar o inferno de callbacks (/como-evitar-o-inferno-de-callbacks/) Mdulos em Node.JS (/modulos-em-nodejs/) O que a NPM do Node.JS (/o-que-e-a-npm-do-nodejs/) Como usar o util.inspect em NodeJS (/como-usar-o-util-inspect-em-node-js/) Mdulos do Ncleo do Node (/modulos-do-nucleo-do-node/) Evoluindo de forma granular em Node (/evoluindo-de-forma-granular-em-node/) Eventos em Node (/eventos-em-node/) Entendendo o Node (/entendendo-o-node/)

(http://feeds.feedburner.com/NodeBR/) Assine nosso Feed


seu@email.com.br Assinar

Receba os novos artigos por email. Ou clique aqui e assine no seu leitor (http://feeds.feedburner.com/NodeBR/).

Compartilhe este post


Tw eetar 5 Curtir 9 pessoas curtiram isso. +4 Recomende isto no Google

(http://creativecommons.org/licenses/by/3.0/br/) 2013 Rafael Henrique Moreira (http://rafadev.com/) sob a licena


Creative Commons. O contedo dos artigos de direito autoral de seus respectivos autores.