.NET - Apresentando e usando o MongoDB


  Neste artigo vou apresentar o MongoDB e mostrar como instalar e usar os principais recursos deste banco de dados NoSQL.

MongoDB !!!

MongoDB vem de humongous (palavra em inglês para expressar algo grande, enorme)

Soa um tanto estranho na primeira vez que pronunciamos e se você ouvir a palavra e não saber do que se trata nunca vai imaginar que MongoDB é um banco de dados não relacional (NoSQL). Mas é.

Mas o que é um banco de dados não relacional (NoSQL) ?

Um banco de dados NoSQL é um software de banco de dados que não utiliza a linguagem SQL (Strutured Query Language) para interagir com o banco de dados.

O MongoDB, é um banco de dados orientado a documentos e de software livre (licença GNU AGPL) que armazena dados em coleções de documentos semelhantes a JSON.

Obs: JSON é um acrônimo para "JavaScript Object Notation", é um formato leve para intercâmbio de dados computacionais. JSON é um subconjunto da notação de objeto de JavaScript, mas seu uso não requer JavaScript exclusivamente.

Os bancos de dados orientados a documentos são bastante diferentes dos tradicionais bancos de dados relacionais. Em vez de armazenar dados em estruturas rígidas, como tabelas, eles os armazenam em documentos vagamente definidos. No caso de tabelas de sistemas de gerenciamento de bancos de dados relacionais (RDBMS), se for preciso acrescentar uma nova coluna, será necessário mudar a definição da própria tabela, que acrescentará aquela coluna a todos os registros existentes (embora potencialmente com valor nulo). Isso se deve ao estrito design baseado em esquema do RDBMS. No entanto, em documentos, é possível acrescentar novos atributos aos documentos individuais sem que outros sejam alterados. Isso porque o design de bancos de dados orientados a documentos costuma ser sem esquema. (fonte: http://www.ibm.com/developerworks/br/library/os-mongodb4/ acessado em março de 2013)

A diferença do MongoDB para outros bancos de dados NoSQL é que ele possui uma linguagem muito poderosa baseada em documento que faz com que a transição de um banco de dados Relacional para o MongoDB seja feita de forma mais fácil e simples.

Além disso ele é fácil de instalar e usar e possui versões para diversos sistemas operacionais (Windows, Linux, OS X , Solares, etc.) podendo ser usado com diversas linguagens de programação incluindo o VB .NET e o C#, é escalável e possui um alto desempenho.

O MongoDB foi escrito na linguagem C++ e armazena dados em documentos de forma muito parecida com a JSON, usando BSON que é uma versão binária da JSON, guardando os dados através do uso de pares chave/valor.

O melhor lugar para aprender sobre o MongoDB é sua página oficial : http://www.mongodb.org/ e você pode fazer o download do MongoDB neste link: http://www.mongodb.org/downloads

Neste artigo eu vou dar noções gerais de como instalar e usar o MongoDB em uma aplicação VB .NET.

Instalando o MongoDB

Acesse a página de download e baixe o MongoDB para uma pasta na sua máquina local. (A versão atual é a 2.4)

Obs : A versão de 32 bits do MongoDB, possui o tamanho dos bancos de dados limitados a no máximo 2 Gb.

A seguir descompacte o arquivo baixado em uma pasta na sua máquina local. Algo como c:\mongodb ou o que melhor lhe apetecer...

Você deverá ver os seguintes arquivos na pasta onde descompactou o MongoDB:

Observe o subdiretório bin. O MongoDB é autossuficiente e não tem nenhuma dependência de outros sistemas. Você pode executá-lo a partir de qualquer pasta que você escolher.

Como o MongoDB precisa de uma pasta de dados para armazenar os arquivos vamos criar uma pasta no drive C: chamada data e dentro dela uma outra pasta chamada db. (Será criada a estrutura c:\data\db)

Você pode fazer isso via Explorer ou abrir um prompt de comandos e digitar:

Agora podemos executar o MongoDB. Podemos fazer isso de duas formas:

  1. Iniciar o MongoDB manualmente

Navegue até a pasta onde você instalou o MongoDB e abra o diretório bin e execute o arquivo mongod.exe

Abaixo vemos isso sendo feito via prompt de comando;

Observe que a pasta de dados \data\db esta sendo alocada;

Esta forma de iniciar o MongoDB o deixa pronto para uso mas deve ser sempre refeita após a inicialização da sua máquina;

2- Iniciar o MongoDB como um serviço do Windows

Inicie um prompt de comando como administrador da sua máquina e digite os seguintes comandos (atenção!! verifique o caminho correto de instalação na sua máquina)

  1. Usando um editor de textos crie um arquivo texto na pasta bin da instalação do seu mongodb chamado mongod.conf com o seguinte conteúdo
dbpath = c:/data/db
logpath = c:/mongodb2.4.0/logs/mongo.log log
logappend = true 
  1. A partir da linha de comando do prompt digite o seguinte comando: mongod.exe --config "c:\mongodb2.4.0\bin\mongod.conf" -- install
  1. net start MongoDB

Vamos entender cada comando:

  1. Primeiro criamos um arquivo texto chamado mongod.conf na pasta de instalação do mongodb diretório /bin;
  2. A seguir executamos o arquivo de configuração para instalar o mongodb como um serviço do windows
  3. Finalmente você inicia o serviço

Gerenciando o MongoDB com MongoVUE

Existem muitas ferramentas que permitem gerenciar o MongoDB. Uma delas é o MongoVUE que é fácil de usar e possui uma versão grátis.

Acesse o site http://www.mongovue.com/ e baixe o MongoVueInstaller-1.5.3.zip e descompacte-o em uma pasta local e faça a instalação.

A primeira vez que você executar o MongoVUE será apresentada uma tela para que você defina uma conexão.

Na primeira vez devemos criar uma conexão clicando no botão + e informando os valores abaixo:

A seguir clique no botão Save e depois clique em Connect para apresentar a tela principal do MongoVUE:

Depois de ter estabelecido uma conexão você pode usar o Database Explorer no painel da esquerda para navegar pelos seus "bancos de dados" (documentos) MongoDB.

Por padrão, você só vai ver um banco de dados chamado local, que não contém qualquer coleção (tipo de tabelas como em um RDBMS).

Instalando o driver do MongoDB para a plataforma .NET

Para poder trabalhar com o MongoDB na plataforma .NET devemos instalar MongoDB C# Driver (server também para VB .NET) que pode ser instalado via Nuget : http://nuget.org/packages/mongocsharpdriver (PM> Install-Package mongocsharpdriver)

Podemos também baixar o driver neste link : https://github.com/mongodb/mongo-csharp-driver/downloads e descompactar o arquivo em uma pasta local.

O MongoDB é muito poderoso e fácil de começar a usar. Vejamos alguns conceitos básicos sobre ele:

  1. Um documento é a unidade básica de dados para o MongoDB, equivalente a uma linha de um sistema de gerenciamento de banco de dados relacional (mas muito mais expressiva).
  2. Uma coleção pode ser vista como o equivalente a um esquema de uma tabela;
  3. Uma única instância do MongoDB pode hospedar vários bancos de dados independentes, cada um que pode ter suas próprias coleções e permissões.
  4. MongoDB vem com shell JavaScrip simples e poderoso que é útil para a administração de instâncias MongoDB e manipulação de dados.
  5. Cada documento tem uma chave especial, "_id", que é única em todo o documento da coleção.

Por não ser um banco de dados relacional o funcionamento do MongoDB é diferente. Abaixo um resumo bem básico de como ele guarda informações:

Na maioria das vezes, você provavelmente vai armazenar instâncias de suas classes como documentos, o que é fácil de fazer com MongoDB. Dessa forma você pode tratar objetos sem necessidade de usar ferramentas ORM para realizar o o mapeamento e ter que usar muitas funções para tratar a impedância entre os objetos e o SQL.

Por exemplo, se eu precisar de um banco de dados para armazenar informações sobre carros, eu faria assim:

  1. Criar uma instância de carro
  2. Definir alguns atributos
  3. Armazenar os atributos no MongoDB

Dessa forma terei um "documento" que contém os atributos do meu objeto carro que eu posso facilmente recuperar e mudar.

Fazendo um paralelo com o modelo relacional e o MongoDB temos que entender alguns conceitos importantes:

Então podemos montar a seguinte tabela de equivalência entre o MongoDB e os RDBMS:

Banco de Dados Relacional MongoDB
Table Collection
Row Document
Column Field
Join Embedding
Schema -

Resumindo :

  1. O MongoDB é composto de bases de dados que contêm coleções.
  2. Uma coleção é feita de documentos.
  3. Cada documento é constituído por campos.
  4. As coleções podem ser indexadas, o que melhora o desempenho de pesquisa e classificação.
  5. Finalmente, quando temos dados do MongoDB fazemos isso através de um cursor cuja real execução é adiada até que seja necessário.

Vale lembrar que no MongoDB não temos o conceito de Schema nem de Join, neste último ao invés usamos o que se chama embedding o que significa que as entidades estão contidas uma nas outras.

Usando o MongoDB em um projeto VB .NET

Vamos ver um exemplo prático de utilização do MongoDB com uma aplicação VB .NET.

Abra o Visual Studio Express 2012 for desktop e no menu FILE clique em New Project;

Selecione o template Visual Basic -> Windows -> Windows Forms Application e informe nome UsandoMongoDB e clique no botão OK.

Clique com o botão direito sobre o nome do projeto e selecione Add Reference;

Clique em Browse e localize a pasta onde você instalou o driver C# do MongoDB;

Selecione os arquivos MongoDB.Boson.dll e MongoDB.Driver.dll e clique em Add;

No formulário form1.vb inclua cinco botões de comando e um controle ListBox conforme o leiaute abaixo:

Botões de comando:
  1. btnCriar
  2. btnRecuperar
  3. btnAlterar
  4. bntRemover
  5. btnTodos

Listbox

  • lstbPessoa

Agora vamos definir as declarações de imports no formulário conforme o código a seguir:

Imports MongoDB.Bson
Imports MongoDB.Driver
Imports MongoDB.Builders

No menu PROJECT clique em Add Class e informe o nome Pessoa.vb. A seguir defina o código da classe Pessoa conforme abaixo:

Public Class Pessoa

    Public Property Nome As String
    Public Property Sobrenome As String
    Public Property Idade As Integer

End Class

No evento Click do botão de comando Criar Objeto e Salvar inclua o código abaixo:

 Private Sub btnCriar_Click(sender As Object, e As EventArgs) Handles btnCriar.Click

        Try
            Dim conexaoMongo As String = "mongodb://localhost/"
            Dim client = New MongoClient(conexaoMongo)
            Dim server = client.GetServer()
            Dim database = server.GetDatabase("TesteMongoDB")

            Dim colecao = database.GetCollection(Of Pessoa)(GetType(Pessoa).Name)
            Dim _pessoa = New Pessoa() With {.Nome = "Jose Carlos", .Sobrenome = "Macoratti", .Idade = 45}

            colecao.Insert(_pessoa)

            MsgBox("Objeto criado e salvo no documento TesteMongoDB com sucesso ! ")

        Catch ex As Exception
            MsgBox("Erro : " & ex.Message)
        End Try

    End Sub

No código acima obtemos uma referência para o objeto Client usando uma string de conexão com localhost

Dim conexaoMongo As String = "mongodb://localhost/"
Dim client = New MongoClient(conexaoMongo)

A seguir obtemos uma referência a um objeto Server a partir do cliente:

Dim server = client.GetServer()

Depois obtemos um referência a um banco de dados (documento) a partir de um objeto server:

Dim database = server.GetDatabase("TesteMongoDB")

Vamos armazenar instâncias da classe Pessoa em uma coleção MongoDB e para isso primeiro temos que obter uma instância MongoCollection.

Cada coleção tem um nome, aqui vamos usar o nome do tipo Pessoa:

Dim colecao = database.GetCollection(Of Pessoa)(GetType(Pessoa).Name)

Como estamos usando a classe de domínio chamada Pessoa teremos uma referência a uma coleção contendo documentos da entidade Pessoa:

A seguir criamos uma instância da classe Pessoa atribuímos valores ao nosso objeto _pessoa.

Dim _pessoa = New Pessoa() With {.Nome = "Jose Carlos", .Sobrenome = "Macoratti", .Idade = 45}

Para inserir um documento usando o comando insert:

colecao.Insert(_pessoa)

Neste momento podemos abrir a ferramenta MongoVUE e espiar o que esta acontecendo:

Observe que o documento TesteMongoDB foi criado de forma automática. O MongoDB não fornece qualquer comando para criar um "banco de dados". O MangoDB vai criar o documento em tempo real, na primeira vez que você salvar o valor para a coleção definida (ou tabela no SQL).

O documento contém uma coleção chamada Pessoa e esta coleção contém um documento que representa a instância que incluímos na coleção:

Observe que apesar da nossa classe Pessoa não ter uma propriedade Id o MongoDB atribui automaticamente um _id (ObjectId) para o documento recém-criado. Quase todos os documentos MongoDB tem um campo _id como seu primeiro atributo. O tipo ObjectId é o tipo mais comum usado para isso. O atributo _id deve ser único para cada documento em uma coleção.

O ObjectId é um valor binário de 12 bytes que consiste de:

O Driver C# tem um pool de conexão para usar conexões para o servidor de forma eficiente. Não há necessidade de Conectar e Desconectar, basta deixar o Driver cuidar das conexões.

Usar Connect seria inofensivo, e usar Disconnect é ruim porque ele fecha todas as conexões no pool de conexão.

Podemos ainda ver os dados exibidos como em uma tabela:

Ou visualizar os dados no formato texto:

Vamos alterar a nossa classe Pessoa, arquivo Pessoa.vb, incluindo a propriedade Id do tipo ObjectId conforme abaixo:

Imports MongoDB.Bson

Public Class Pessoa
    Public Property Id as ObjectId
    Public Property Nome As String
    Public Property Sobrenome As String
    Public Property Idade As Integer
End Class

Vamos a seguir mostrar como realizar as operações básicas com o MongoDB em uma aplicação VB .NET incluindo, lendo, alterando e removendo informações de um documento.

Em cada exemplo estarei mostrando o resultado usando a ferramenta MongoVUE.

1- Criando um documento e incluindo informações

Vamos alterar o código do botão de comando Criar Objeto e Salvar conforme abaixo:

 Private Sub btnCriar_Click(sender As Object, e As EventArgs) Handles btnCriar.Click
        Try
            Dim conexaoMongo As String = "mongodb://localhost/"
            Dim client = New MongoClient(conexaoMongo)
            Dim server = client.GetServer()
            Dim database = server.GetDatabase("TesteMongoDB")
            Dim colecao = database.GetCollection(Of Pessoa)("Pessoas")

            _pessoa = New Pessoa() With {.Nome = "Jose Carlos", .Sobrenome = "Macoratti", .Idade = 45}
            colecao.Insert(_pessoa)
            _pessoa = New Pessoa() With {.Nome = "Miriam", .Sobrenome = "Siqueira", .Idade = 38}
            colecao.Insert(_pessoa)
            _pessoa = New Pessoa() With {.Nome = "Jefferson", .Sobrenome = "Santos", .Idade = 20}
            colecao.Insert(_pessoa)
            _pessoa = New Pessoa() With {.Nome = "Janice", .Sobrenome = "Vieira", .Idade = 18}
            colecao.Insert(_pessoa)

            MsgBox("Objeto criado e salvo no documento TesteMongoDB com sucesso ! ")

        Catch ex As Exception
            MsgBox("Erro : " & ex.Message)
        End Try

    End Sub
 
 

O código acima cria o documento TesteMongoDB contendo as informações para 4 objetos Pessoa.

1- Recuperando informações de um documento

Private Sub btnRecuperar_Click(sender As Object, e As EventArgs) Handles btnRecuperar.Click
        Try
            Dim conexaoMongo As String = "mongodb://localhost/"
            Dim client = New MongoClient(conexaoMongo)
            Dim server = client.GetServer()
            Dim database = server.GetDatabase("TesteMongoDB")
            Dim colecao = database.GetCollection(Of Pessoa)("Pessoas")

            _pessoa = New Pessoa() With {.Nome = "Jessica", .Sobrenome = "Lima", .Idade = 18}

            colecao.Insert(_pessoa)
            Dim id = _pessoa.Id

            Dim consulta = Query.EQ("_id", id)
            _pessoa = colecao.FindOne(consulta)

            lstbPessoa.Items.Clear()
            lstbPessoa.Items.Add(_pessoa.Nome & " - " & _pessoa.Idade)

        Catch ex As Exception
            MessageBox.Show("Erro ao recuperar objeto : " & ex.Message)
        End Try

    End Sub
 
 

Neste código incluímos uma nova pessoa e recuperamos suas informações usando uma consulta :

Dim consulta = Query.EQ("_id", id)
_pessoa = colecao.FindOne(consulta)

e listando as informações no ListBox.

1- Alterando informações de um documento

 Private Sub btnAlterar_Click(sender As Object, e As EventArgs) Handles btnAlterar.Click
        Try
            Dim connectionString = "mongodb://localhost"
            Dim client = New MongoClient(connectionString)
            Dim server = client.GetServer()
            Dim database = server.GetDatabase("TesteMongoDB")
            Dim colecao = database.GetCollection(Of Pessoa)("Pessoas")

            Dim consulta = Query.EQ("Nome", "Jessica")
            _pessoa = colecao.FindOne(consulta)
            _pessoa.Nome = "Jessica Naara"

            colecao.Save(_pessoa)

        Catch ex As Exception
            MessageBox.Show("Erro ao alterar objeto : " & ex.Message)
        End Try
    End Sub
 
 

Para alterar informações em um documento primeiro realizamos uma consulta para localizar a informação, procedemos à alteração e usamos o comando Save para salvar a coleção.

Dim consulta = Query.EQ("Nome", "Jessica")
_pessoa = colecao.FindOne(consulta)
_pessoa.Nome = "Jessica Naara"

colecao.Save(_pessoa)

1- Removendo informações de um documento

 Private Sub btnRemover_Click(sender As Object, e As EventArgs) Handles btnRemover.Click
        Try
            Dim connectionString = "mongodb://localhost"
            Dim client = New MongoClient(connectionString)
            Dim server = client.GetServer()
            Dim database = server.GetDatabase("TesteMongoDB")
            Dim colecao = database.GetCollection(Of Pessoa)("Pessoas")

            Dim consulta = Query.EQ("Nome", "Jessica Naara")
            _pessoa = colecao.FindOne(consulta)

            colecao.Remove(consulta)

        Catch ex As Exception
            MessageBox.Show("Erro ao remover objeto : " & ex.Message)
        End Try
    End Sub
 
 

Para remover informações de um documento primeiro realizamos uma consulta para localizar a informação e usamos o comando Remove para remover a informação :

Dim consulta = Query.EQ("Nome", "Jessica Naara")
_pessoa = colecao.FindOne(consulta)

colecao.Remove(consulta)

1- Lendo as informações de um documento

  Private Sub btnTodos_Click(sender As Object, e As EventArgs) Handles btnTodos.Click
        Try
            Dim connectionString = "mongodb://localhost"
            Dim client = New MongoClient(connectionString)
            Dim server = client.GetServer()
            Dim database = server.GetDatabase("TesteMongoDB")

            Dim pessoas = database.GetCollection("Pessoas").FindAll().SetSortOrder(Sortby.Descending("Sobrenome"))

            lstbPessoa.Items.Clear()

            For Each pessoa In pessoas
                lstbPessoa.Items.Add(pessoa("Sobrenome").ToString() & " - " & pessoa("Nome").ToString())
            Next
        Catch ex As Exception
            MessageBox.Show("Erro ao listar objetos : " & ex.Message)
        End Try
    End Sub
 
 

Para ler as informações de um documento acessamos sua coleção usando o comando FindAll. No exemplo realizarmos uma ordenação descendente pelo Sobrenome.

A seguir percorremos a coleção usando um laço for/each e exibimos as informações desejadas:

Dim pessoas = database.GetCollection("Pessoas").FindAll().SetSortOrder(Sortby.Descending("Sobrenome"))

For Each pessoa In pessoas
     lstbPessoa.Items.Add(pessoa("Sobrenome").ToString() & " - " & pessoa("Nome").ToString())
Next

Exibindo informações no console Mongo Shell

Podemos exibir as informações de documento no MongoDB usando a ferramenta Mongo Shell.

Após iniciar o serviço do MongoDB abra uma janela de prompt de comando e digite a linha de comando abaixo para iniciar o mongo.exe:

c:\monbodb2.4.0\bin\mongo.exe

A seguir vamos exibir as nosas informações existentes no MongoDB:

 
1- show dbs

Exibe os documentos existentes

2- use TesteMongoDB

Acessa o documento TesteMongoDB

3- show collections

Exibe as coleções existentes

4- db.Pessoas.find().toArray()

Lista as informações da coleção

 

Note que o MongoDB mapeou nosso campo "id" para um campo chamado "_id". Estas são as chaves que MongoDB usa internamente para identificar os documentos, bem como determinar se o documento está sendo inserido de novo ou esta simplesmente sendo atualizado.

Temos portanto esta alternativa para acessar e verificar informações no MongoDB.

O MongoDB é uma alternativa aos bancos de dados relacionais e dependendo do cenário pode ser uma opção válida de armazenamento e gerenciamento de informações e que responde muito rápido a consultas.

Pegue o projeto exemplo aqui: UsandoMongoDB.zip

Mat 16:15 Mas vós, perguntou-lhes Jesus, quem dizeis que eu sou?

Mat 16:16 Respondeu-lhe Simão Pedro: Tu és o Cristo, o Filho do Deus vivo.

Mat 16:17 Disse-lhe Jesus: Bem-aventurado és tu, Simão Barjonas, porque não foi carne e sangue que to revelou, mas meu Pai, que está nos céus.


José Carlos Macoratti