Nodejs e MongoDB - Introdução ao Mongoose - NodeBR - NodeJS Brasil

download Nodejs e MongoDB - Introdução ao Mongoose - NodeBR - NodeJS Brasil

of 8

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