MongoDB - Acessando o MongoDB na nuvem (mongolab) - II

 Neste tutorial eu vou mostrar como criar e acessar um banco de dados MongoDB na nuvem.

Na primeira parte do artigo criamos e hospedamos o nosso banco de dados no MongoLab e fizemos nosso primeiro acesso ao banco criando um documento.

Vamos continuar realizando outras operações com o nosso MongoDB na nuvem.

Nota: Para saber mais sobre o MongoDB leia este artigo :  NET - Apresentando e usando o MongoDb - Macoratti

Apenas para recordar. Nosso banco de dados vendadb possui uma coleção Pessoas com as seguintes informações:

Atualizando dados de uma coleção

Vamos abrir o nosso projeto criado na pasta mongodb_demo no Visual Studio Code.

Para isso podemos abrir o VS Code e no menu File clicar em Open Folder e selecionar a pasta mongodb_demo.

Vamos criar um arquivo chamado update.js no projeto onde iremos definir o código que vai atualizar dados da nossa coleção Pessoas criada na aula anterior.

Clique no ícone New File para criar um novo arquivo no projeto e informe o nome update.js:

A seguir digite o código abaixo neste arquivo:

//Vamos importar os drivers nativos do mongodb
var mongodb = require('mongodb')
//Precisamos usar a interface "MongoClient" para se conectar com o servidor
var MongoClient = mongodb.MongoClient
// URL da conexão 
var url = 'mongodb://usuario:senha@ds145380.mlab.com:45380/vendasdb'
// Usamos o método connect para se conectar com o servidor
MongoClient.connect(url, function (err, db) {
    if (err) {
        console.log('Não foi possível se conectar com o servidor MongoDB. Error:', err)
    }
    else {
        //feita a conexão
        console.log('Conexão com o banco de dados estabelecida com sucesso')
        // Obtem a coleção de documentos
        var collection = db.collection('Pessoas')

        // Atualiza dados
        console.log('Alterando o email de Macoratti...')       
        //usando o comando update para atualizar dados
        collection.update({ nome: 'Macoratti' }, { $set: { email: 'macoratti@alterado.com.br' } }, function (err, numUpdated) {
            if (err) {
                console.log(err);
            } else if (numUpdated) {
                console.log('Documento Atualizado com sucesso.', numUpdated)
            } else {
                console.log('Nenhum documento encontrado!')
            }
            //Fecha a conexão
            db.close();
        });
    }
});

Abaixo vemos o mesmo código no VS Code:

Neste código estou criando uma instância do MongoClient e fazendo a conexão com o banco de dados mongoDB vendasdb criado no site mongolab.

A string de conexão usada é : mongodb://seu_usuario:sua_senha@ds145380.mlab.com:45380/vendasdb

A seguir estou obtendo a referência à coleção Pessoas via método db.Collection() e a seguir usando o método update para atualizar dados da coleção.

Nota: Para atualizar documentos no MongoDB temos 3 opções : UpdateOne, UpdateMany e ReplaceOne.

A sintaxe do comando update é a seguinte :  db.collection.update(query, update, options)

Ele modifica um documento existente ou documentos em uma coleção. O método pode modificar campos especificados de um documento existente ou substituir todo o documento dependendo do parâmetro usado.

Para atualizar um campo específico podemos usar o operador $set que substitui o valor do campo com o valor especificado.(se o campo não existir ele será criado quando update for usado com o operador $set)

É o que estamos usando para atualizar o email do nome igual a 'Macoratti':

 collection.update({ nome: 'macoratti' }, { $set: { email: 'macoratti@alterado.com.br' } }, function (err, numUpdated)

Vamos executar o arquivo update.js na janela de prompt de comando digitando: node update

Iremos obter o resultado abaixo para a execução com sucesso :

Acessando o banco e verificando a coleção Pessoas vemos que o email para 'Macoratti'  foi alterado realmente:

Consultando dados de uma coleção

Vamos criar em nosso projeto o arquivo select.js e realizar uma consulta na coleção Pessoas.

Vamos consultar os dados do nome igual a 'Macoratti'.

Para isso inclua o código abaixo no arquivo select.js :

//Vamos importar os drivers nativos do mongodb
var mongodb = require('mongodb')
//Precisamos usar a interface "MongoClient" para se conectar com o servidor
var MongoClient = mongodb.MongoClient
// URL da conexão 
var url = 'mongodb://usuario:senha@ds145380.mlab.com:45380/vendasdb'
// Usamos o método connect para se conectar com o servidor
MongoClient.connect(url, function (err, db) {
    if (err) {
        console.log('Não foi possível se conectar com o servidor MongoDB. Error:', err)
    }
    else {
        //feita a conexão
        console.log('Conexão com o banco de dados estabelecida com sucesso')
        // Obtem a coleção de documentos
        var collection = db.collection('Pessoas')

        // consulta dados
        console.log('Consultando dados de Macoratti...')
        // define o criterio para encontrar os dados
        collection.find({ nome: 'Macoratti' }).toArray(function (err, result) {
            if (err) {
                console.log(err);
            } else if (result.length) {
                console.log('Encontrado:', result);
            } else {
                console.log('Nenhum documento encontrado com o critério definido!');
            }
            //fecha a conexão
            db.close();
        });
    }
});

Neste código usamos o método find cuja sintaxe é :  db.collection.find(query, projection)

Este método seleciona o documento(s) na coleção que atende o critério {nome: 'Macoratti'} e retorna um cursor para o documento(s) selecionado.

O parâmetro projection determina quais campos são retornados nos documentos correspondentes. Esse parâmetro toma um documento no seguinte formato:  { field1: <value>, field2: <value> ... }

Obs: No nosso exemplo não estamos usando projection.

Vamos executar o arquivo select.js na janela de prompt de comando digitando: node select

Abaixo vemos o resultado exibindo os dados para o critério informado usando o método find :

Trabalhando com um cursor de dados

No exemplo anterior usamos um .ToArray encadeado com find para retornar o resultado, pois a execução apenas do metódo find irá retornar um cursor db.

Nota: Um cursor é um ponteiro para o conjunto de resultados de uma consulta. Os clientes podem iterar através de um cursor para recuperar resultados.

E neste caso teríamos que iterar sobre o cursor para obter o resultado.  (No cliente Mongo Shell se você não atribuir o retorno do find para uma variável o cursor gerado será iterado de forma automática 20 vezes para inicir os resultados iniciais)

Ao usar toArray o mongo diz ao driver que queremos dados completos de cada usuário.

Em outras palavras, quando você executa uma consulta procurando documentos usando find() , o que é retornado é um ponteiro para os resultados dessa consulta ao invés de todos os resultados de uma única vez (como você pode imaginar, isso pode ser impraticável e lento para resultados de conjuntos de dados muito grandes).

Essencialmente, o cursor é o canal que você usará para extrair todos os resultados de uma consulta do banco de dados. Vejamos um exemplo.

Vamos criar em nosso projeto o arquivo cursor.js e realizar uma consulta na coleção Pessoas.

Vamos consultar os dados para nome igual a 'Macoratti' =>  { "nome" : "Macoratti"}

Para isso inclua o código abaixo no arquivo cursor.js :

//Vamos importar os drivers nativos do mongodb
var mongodb = require('mongodb')
//Precisamos usar a interface "MongoClient" para se conectar com o servidor
var MongoClient = mongodb.MongoClient
// URL da conexão 
var url = 'mongodb://usuario:senha@ds145380.mlab.com:45380/vendasdb'
// Usa o método connect para se conectar ao servidor
MongoClient.connect(url, function (err, db) {
    if (err) {
        console.log('Não foi possível se conectar com o servidor MongoDB. Error:', err)
    }
    else {
        //feita a conexão
        console.log('Conexão com o banco de dados estabelecida com sucesso')
        // Obtem a coleção de documentos
        var collection = db.collection('Pessoas')
        // consulta dados
        console.log('Usando um cursor...')
        //Obtemos um cursor com os dados para o critério informado
        var cursor = collection.find({ nome: 'Macoratti' });
        // Vamos ordenar pelo nome (no exemplo não terá efeito algum)
        cursor.sort({ nome : -1 });
        //Limita a 10 registros
        cursor.limit(10);
        //Pula 0 registros. 
        cursor.skip(0);
        //Vamos iterar no resultado
        cursor.each(function (err, doc) {
            if (err) {
                console.log(err);
            } else {
                console.log('Encontrado : ', doc);
            }
        });
    }
});

Observe que obtemos um cursor usando o método find() e que percorremos o resultado usando o método cursor.each() que é aplicado a cada documento no cursor.

Nota:  Por padrão o servidor MongoDB retorna o resultado das consultas em lotes (o tamanho do lote não deve exceder o tamanho máximo do documento BSON), para a maioria das consultas o primeiro lote retorna 101 documentos ou documentos até 1 MB, os lotes subsequentes retornam 4 MB.

Para executar o código digite:  node cursor

Abaixo vemos o resultado no console :

Uma forma de reduzir o tamanho dos dados retornados para consultas no MongoDB é usar projection.

Na próxima parte do artigo vamos continuar a realizar mais algumas operações com o MongoDB criado na nuvem desta vez usando o Mongoose.

(Disse Jesus) Na verdade, na verdade vos digo que quem ouve a minha palavra, e crê naquele que me enviou, tem a vida eterna, e não entrará em condenação, mas passou da morte para a vida.
João 5:24

Veja os Destaques e novidades do SUPER DVD Visual Basic (sempre atualizado) : clique e confira !

Quer migrar para o VB .NET ?

Quer aprender C# ??

Quer aprender os conceitos da Programação Orientada a objetos ?

Quer aprender o gerar relatórios com o ReportViewer no VS 2013 ?

  Gostou ?   Compartilhe no Facebook   Compartilhe no Twitter

Referências:


José Carlos Macoratti