.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:
- MongoDB – http://www.mongodb.org/downloads
- MongoDB C# Driver – https://github.com/mongodb/mongo-csharp-driver/downloads (via download)
- ou http://nuget.org/packages/mongocsharpdriver (PM> Install-Package mongocsharpdriver)
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:
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. 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:
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 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
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():
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
















