Nodejs e MongoDB - Introdução ao Mongoose - NodeBR - NodeJS Brasil
Transcript of Nodejs e MongoDB - Introdução ao Mongoose - NodeBR - NodeJS Brasil
-
(/)
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:
npm install Mongoose
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.
Home (/) Arquivo (/arquivo/) Tags (/tags/) Mapa (/mapa/)
-
var Mongoose = require('Mongoose');
var db = Mongoose.connection;
db.on('error', console.error);
db.once('open', function() {
console.log('Conectado ao MongoDB.')
// Vamos adicionar nossos Esquemas, Modelos e consultas aqui
});
Mongoose.connect('mongodb://localhost/test');
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 Mongoose.connect() - o parmetro poolSize define a
quantidade de conexes simultneas. Veja abaixo a sada do meu MongoDB exibindo que foram
abertas 5 conexes simultneas:
Sat Aug 31 11:12:21.827 [initandlisten] connection accepted from 127.0.0.1:64413 #2 (1 conn
ection now open)
Sat Aug 31 11:12:21.830 [initandlisten] connection accepted from 127.0.0.1:64414 #3 (2 conn
ections now open)
Sat Aug 31 11:12:21.831 [initandlisten] connection accepted from 127.0.0.1:64415 #4 (3 conn
ections now open)
Sat Aug 31 11:12:21.831 [initandlisten] connection accepted from 127.0.0.1:64416 #5 (4 conn
ections now open)
Sat Aug 31 11:12:21.832 [initandlisten] connection accepted from 127.0.0.1:64417 #6 (5 conn
ections now open)
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 movieSchema e nosso modelo Movie criado.
var movieSchema = new Mongoose.Schema({
title: { type: String },
rating: String,
releaseYear: Number,
hasCreditCookie: Boolean
});
var Movie = Mongoose.model('Movie', movieSchema);
-
A ltima linha deste cdigo compila o modelo Movie utilizando o esquema movieSchema como
estrutura. O Mongoose tambm cria uma coleo no MongoDB chamada Movies para estes
documentos.
Voc pode notar que o modelo Movie 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 save.
Criar, Recuperar, Atualizar e Deletar (CRUD)
Criar um novo documento Movie fcil agora que j definimos o modelo, basta instancializar o modelo
Movie e salvar esta instncia na base. Atualizar igualmente fcil, faa suas modificaes e ento
chame a funo save do seu documento.
var thor = new Movie({
title: 'Thor',
rating: 'PG-13',
releaseYear: '2011', // Note o uso de String ao inves de Number
hasCreditCookie: true
});
thor.save(function(err, thor) {
if (err) return console.error(err);
console.dir(thor);
});
Observe que utilizamos uma String ao invs de um Nmero no campo releaseYear 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
save vai fornecer um documento recm criado, observado pelo que foi impresso no console de nossa
aplicao.
{ __v: 0,
title: 'Thor',
rating: 'PG-13',
releaseYear: 2011,
hasCreditCookie: true,
_id: 5222012cb65eddf003000001 }
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 _id.
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.
// Buscando um unico filme pelo nome
Movie.findOne({ title: 'Thor' }, function(err, thor) {
if (err) return console.error(err);
console.dir(thor);
});
// Buscando todos os filmes
Movie.find(function(err, movies) {
if (err) return console.error(err);
console.dir(movies);
});
// Buscando todos os filmes que possuem 'credit cookie'.
Movie.find({ hasCreditCookie: true }, function(err, movies) {
if (err) return console.error(err);
console.dir(movies);
});
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.
movieSchema.statics.findAllWithCreditCookies = function(callback) {
return this.find({ hasCreditCookie: true }, callback);
};
var Movie = Mongoose.model('Movie', movieSchema);
// Utilizadno a funcao auxiliar estatica do modelo 'Movie' compilado
Movie.findAllWithCreditCookies(function(err, movies) {
if (err) return console.error(err);
console.dir(movies);
});
-
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 Timeout 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.
var Mongoose = require('Mongoose');
var db = Mongoose.connection;
db.on('error', console.error);
db.once('open', function() {
// Create your schemas and models here.
console.log('Conectado.')
var movieSchema = new Mongoose.Schema({
title: { type: String },
rating: String,
releaseYear: Number,
hasCreditCookie: Boolean
});
movieSchema.statics.findAllWithCreditCookies = function(callback) {
return this.find({ hasCreditCookie: true }, callback);
};
var Movie = Mongoose.model('Movie', movieSchema);
for (var i =1; i
-
setTimeout(function(){
// Utilizadno a funcao auxiliar estatica do modelo 'Movie' compilado
Movie.findAllWithCreditCookies(function(err, movies) {
if (err) return console.error(err);
console.log('Buscado: ')
console.dir(movies);
});
}, 1000);
});
Mongoose.connect('mongodb://localhost/test');
Anterior (/livro-aplicacoes-web-real-time-com-node-js/) Arquivo (/arquivo/)
Prximo (/mineracao-de-dados-e-as-funcoes-map-reduce-filter/)
-
8 Comentrios NodeBR Autenticar
Ordenar por Melhor Partilhar
Participar no debate
Responder
Thyago Luciano 4 meses atrs
Faltou so Colocar os creditos ( http://blog.modulus.io/getting... )
3
Responder
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
Eduardo Matos 7 meses atrs
Bacana cara, bom post pra quem t comeando! =D
Responder
Rafael Henrique Moreira 7 meses atrs Eduardo Matos
Obrigado Eduardo, A inteno essa mesmo, mostrar para os novatos como fcil e
divertido subir aplicaes utilizando Node no back-end.
1
Responder
Uli Oreggia 7 meses atrs
Muito bom mesmo! Estava com dificuldade de compreender o funcionamento do Mongoose e
esse post resolveu
Responder
Rafael Henrique Moreira 7 meses atrs Uli Oreggia
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
Caio Ribeiro Pereira 7 meses atrs
Post excelente! Parabns!
Responder
Rafael Henrique Moreira 7 meses atrs Caio Ribeiro Pereira
Obrigado Caio, voc sabe que voc uma grande inspirao para mim. =)
Favorito
Partilhar
Partilhar
Partilhar
Partilhar
Partilhar
Partilhar
Partilhar
Partilhar
Publicado em
-
(mailto:[email protected]) (http://rafadev.com/) (https://github.com/rafadev7)(https://twitter.com/rafadev7)
31 de Agosto de 2013
Tags
dica 3 (/tags/#dica)
Autor
Rafael Henrique Moreira
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-reduce-
filter/)
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
Receba os novos artigos por email.
Ou clique aqui e assine no seu leitor (http://feeds.feedburner.com/NodeBR/).
Compartilhe este post
TweetarTweetar 5 9 pessoas curtiram isso.CurtirCurtir
+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.
[email protected] Assinar