.NET - MongoDB - Executando consultas com LINQ


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.

Nesta dica eu mostro como podemos executar consultas LINQ com 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.

Atenção !!!

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

  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;

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.

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;

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:

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 esta 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
  • Sair

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() ;

tr
 
 

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.

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

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

João 13:13 Vós me chamais Mestre e Senhor; e dizeis bem, porque eu o sou.

João 13:14 Ora, se eu, o Senhor e Mestre, vos lavei os pés, também vós deveis lavar os pés uns aos outros.

João 13:15 Porque eu vos dei exemplo, para que, como eu vos fiz, façais vós também.

João 13:16 Em verdade, em verdade vos digo: Não é o servo maior do que o seu senhor, nem o enviado maior do que aquele que o enviou.

João 13:17 Se sabeis estas coisas, bem-aventurados sois se as praticardes.

Referências:


José Carlos Macoratti