Dev (Back & Front)ARTIGO

.NET – MongoDB – Executando consultas com LINQ

No artigo de hoje eu mostro como podemos executar consultas LINQ com o MongoDB.

Em meu artigo “.NET – Apresentando e usando o MongoDB” eu dei uma visão geral sobre o MongoDB, sua instalação e utilização na plataforma .NET. Hoje eu mostro como podemos executar consultas LINQ com o MongoDB. Então, vamos lá!

Recursos usados neste artigo:

Com o MongoDB e o driver MongoDB C# Driver (server também para VB .NET) devidamente instalados, vamos criar um projeto desta vez usando a linguagem C# e mostrar com executar consultas LINQ.

Lembre-se de executar o MongoDB para atender as requisições.

Iniciar o MongoDB manualmente

Navegue até a pasta onde você instalou o MongoDB e abra o diretório bin, depois execute o arquivo mongod.exe. Abaixo vemos isso sendo feito via prompt de comando:

net_mongo3

Usando o MongoDB em um projeto C# com consultas LINQ

Abra o Visual Studio Express 2012 for desktop e no menu FILE clique em New Project. Selecione o template C# -> Windows -> Windows Forms Application e informe nome MongoDB_Linq e clique no botão OK.

net_mglq1

Clique com o botão direito sobre o nome do projeto e selecione Add Reference. Depois clique em Browse e localize a pasta onde você instalou o driver C# do MongoDB. Selecione, a seguir, os arquivos MongoDB.Boson.dll e MongoDB.Driver.dll e clique em Add:

net_mongo9

Clique com o botão direito sobre o nome do projeto e selecione Add Reference. Vamos incluir uma referência ao namespace System.Configuration clicando na guia Assemblies e marcando a opção conforme abaixo:

net_mglq3

Abra o arquivo App.Config e inclua a definição da string de conexão usada para o MongoDB. Na minha máquina local a conexão está sendo feita em localhost porta 27017:

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
    <startup> 
        <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.5" />
    </startup>
  <appSettings>
    <add key="stringConexaoMongoDB" value="Server=localhost:27017"/>
  </appSettings>
</configuration>

No menu PROJECT clique em Add Class e informe o nome Contatos.cs. A seguir, defina o código da classe Contato conforme abaixo:

using MongoDB.Bson;

namespace MongoDB_Linq
{
    class Contato
    {
        public ObjectId Id { get; set; }
        public string Nome { get; set; }
        public string Email { get; set; }
        public int Idade { get; set; }
    }
}

No menu PROJECT clique em Add Class e informe o nome AcessoMongo.cs. Esta classe será responsável pelo acesso ao MongoDB.

A seguir defina o código da classe conforme abaixo:

using System;
using System.Collections.Generic;
using System.Linq;
using MongoDB.Bson;
using MongoDB.Driver;
using MongoDB.Driver.Linq;
using System.Configuration;

namespace MongoDB_Linq
{

    public class AcessoMongo
    {
        static Contato _contato;

        public static string ConnectionString
        {
            get
            {
                return ConfigurationManager.AppSettings["stringConexaoMongoDB"];
            }
        }

        public void CriarDados()
        {
            CriarContatos();
        }

        public void CriarContato(string nome, string email, int idade)
        {
            MongoClient cliente = new MongoClient(ConnectionString);
            MongoServer server = cliente.GetServer();
            MongoDatabase database = server.GetDatabase("MongoLinq");

            var colecao = database.GetCollection<Contato>("Contatos");

            BsonDocument contato = new BsonDocument {
                        { "Nome", nome },
                        { "Email", email },
                        { "Idade", idade }
                        };

            colecao.Insert(contato);
        }

        private static void CriarContatos()
        {
            try
            {
                MongoClient cliente = new MongoClient(ConnectionString);
                MongoServer server = cliente.GetServer();
                MongoDatabase database = server.GetDatabase("MongoLinq");

                var colecao = database.GetCollection<Contato>("Contatos");

                _contato = new Contato
                {
                    Nome = "Jose Carlos",  Email = "macoratti@yahoo.com", Idade = 45
                };
                colecao.Insert(_contato);
                _contato = new Contato
                {
                    Nome = "Miriam", Email = "miriamsq@bol.com.br", Idade = 38
                };
                colecao.Insert(_contato);
                _contato = new Contato
                {
                    Nome = "Jefferson", Email = "jeff@net.com.br", Idade = 20
                };
                colecao.Insert(_contato);
                _contato = new Contato
                {
                    Nome = "Yuri",  Email = "yuri@net.com.br", Idade = 18
                };
                colecao.Insert(_contato);
                _contato = new Contato
                {
                    Nome = "Bianca",Email = "bibi@uol.com.br", Idade = 16
                };
                colecao.Insert(_contato);
                _contato = new Contato
                {
                    Nome = "Janice", Email = "janjan@uol.com.br", Idade = 18
                };
            }
            catch (Exception ex)
            {
                throw ex;
            }
        }

        public IEnumerable<Contato> GetTodosContatos()
        {
            MongoClient cliente = new MongoClient(ConnectionString);
            MongoServer server = cliente.GetServer();
            MongoDatabase database = server.GetDatabase("MongoLinq");

            var contatosLista = database.GetCollection<Contato>("Contatos");
            var query = from e in contatosLista.AsQueryable<Contato>()
                        select e;

            return query;
        }

        public IEnumerable<Contato> GetContatosPorNome(string nome)
        {
            MongoClient cliente = new MongoClient(ConnectionString);
            MongoServer server = cliente.GetServer();
            MongoDatabase database = server.GetDatabase("MongoLinq");

            var contatosLista = database.GetCollection<Contato>("Contatos");
            var query = from e in contatosLista.AsQueryable<Contato>()
                        where e.Nome == nome
                        select e;

            return query;
        }

    }
}

Na classe AcessoMongo temos os seguintes métodos:

  • ConnectionString – retorna a string de conexão a partir do arquivo App.Config;
  • CriarDados – Cria o documento MongoLing e insere alguns dados para teste;
  • CriarContato – Inclui novas informações em um documento;
  • CriarContatos – Chamada pelo método CriarDados;
  • GetTodosContatos – Retorna todos os contatos do documento;
  • GetContatosPorNome – Consulta os documentos e retorna as informações de um contato pelo seu nome.

Note que estamos referenciando o namespace :using MongoDB.Driver.Linq.

  • No formulário form1.cs inclua os seguintes controles:
  • Botões de comando: btnConsultar
  • TextBox: txtNome
  • Listbox: lstbDados
  • MenuStrip: Criar Dados e Sair

net_mglq2

Vejamos a agora o código usado no formulário para consultar informações de contatos no MongoDB:

using System;
 using System.Windows.Forms;

No menu Arquivo->Criar Dados defina o código para criar dados no MongoDB usando o método CriarDados():

net_mglq4

A chamada deste método cria o documento MongoLing e os dados conforme mostrado na figura pela ferramenta MongoVUE.

No evento Click do botão de comando Consultar inclua o código abaixo:

 private void btnConsultar_Click(object sender, EventArgs e)
        {
            AcessoMongo mongo = new AcessoMongo();

            if (string.IsNullOrWhiteSpace(txtNome.Text))
            {

                var consulta = mongo.GetTodosContatos();
                foreach (var contato in consulta)
                {
                    lstbDados.Items.Add(contato.Nome);
                }
            }
            else
            {
                var consulta = mongo.GetContatosPorNome(txtNome.Text);
                foreach (var contato in consulta)
                {
                    lstbDados.Items.Add(contato.Nome + " - " + contato.Email + " - " + contato.Idade);
                }
            }
        }

Neste código, o usuário informa o nome na caixa de texto e através do método GetContatosPorNome() será retornado os dados do contato.

net_mglq6

Se um nome não for informado será acionado o método GetTodosContatos() que retorna todos os nomes do documento MongoDB:

net_mglq5

Como vimos a execução de consultas LINQ é bastante funcional e não exige nenhum configuração da base de dados MongoDB.

Pegue o projeto exemplo aqui: MongoDB_Linq.zip

é referência em Visual Basic no Brasil e autor dos livros "Aprenda Rápido: ASP" e "ASP, ADO e Banco de Dados na Internet". Mantenedor do site macoratti.net.

Ver perfil