in C#

MongoRepository

Recentemente estava desenvolvendo uma aplicação que logava a exibição de certos tipos de publicidade e intervenção para os usuários, como infraestrutura de banco de dado, optei por usar o MongoDB, para aceso a dados, utilizei um projeto que já era utilizado em outras aplicações da empresa, o MongoRepository, que é uma biblioteca que implementa o padrão Repository em cima do driver oficial para C# do MongoDB.

MongoDB

É possível utilizar o MongoDB em um ambiente Windows, para ambientes de produção recomento a implantação utilizando Linux. Mas neste post vou utilizar a versão para Windows 64Bits que está disponível em: http://www.mongodb.org/downloads .

Robomongo

Para ferramenta de gerenciamento do MongoDB, eu recomendo o uso do Robomongo (http://robomongo.org/), um Shell com vários recursos, onde você consegue executar diversas consultas e enxergar como estão suas collections e seus documentos.

Nuget

Para começar a usar o MongoRepository, vamos adicionar o Nuget Package da biblioteca: https://www.nuget.org/packages/MongoRepository/

PM> Install-package MongoRepository

Com isso já podemos começar a desenvolver, claro que também é possível baixar o projeto do Codeplex.

Configurações

Ao instalar o package ele irá adicionar uma chave de configuração no app.config ou no web.config da aplicação, no caso deste exemplo, vou executar o servidor de MongoDB na minha própria maquina.

<?xml version="1.0" encoding="utf-8"?>
<configuration>
  <startup>
    <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.5.1" />
  </startup>
  <connectionStrings>
    <add name="MongoServerSettings" connectionString="mongodb://localhost/MyDatabase" />
  </connectionStrings>
</configuration>

Entidades

A maneira de definir os documentos que vamos armazenar é simplesmente fazer com que a classe deles herde de Entity (MongoRepository.Entity).

ex:

public class PageView : Entity
{
    public string Url{ get; set; }
    public DateTime Data{ get; set; }
}

Caso o nosso documento possua outros tipos que serão armazenados com eles, por exemplo um Usuario tem Urls visitadas, o segundo objeto não precisa herder de Entity.

public class Usuario : Entity
{
    public string Nome { get;set; }
    public string Sobrenome { get;set; }
    public string Email { get;set; }
    public List<Url> UrlsVisitadas { get; set; }
}
public class Url
{
    public string TextoUrl { get;set; }
    public DateTime DataVisita{ get;set; }
}

Com as nossas classes desta maneira já podemos começar a trabalhar com nossos dados.

Repository

Agora com nossas classes criadas, podemos começar a inserir usuários, para isto, é só criar um MongoRepository<Usuario> e podemos facilmente manipular nosso documentos no MongoDB.

ex:

using MongoRepository;
using System.Linq;

namespace ConsoleApplication6
{
    class Program
    {
        static void Main(string[] args)
        {
            var usuarioRepository= new MongoRepository<Usuario>();
            var demo1 = new Usuario() { Nome = "demo 1", Sobrenome = "sobredemo", Email = "[email protected]" };
            var demo2 = new Usuario() { Nome = "demo 2", Sobrenome = "sobredemo", Email = "[email protected]" };
            var demo3 = new Usuario() { Nome = "demo 3", Sobrenome = "sobredemo", Email = "[email protected]" };
            var demo4 = new Usuario() { Nome = "demo 4", Sobrenome = "sobredemo", Email = "[email protected]" };

            usuarioRepository.Add(demo1);
            //ou
            usuarioRepository.Add(new[] { demo2, demo3, demo4 });

            //select de um usuario
            var usuario = usuarioRepository.Where(a => a.Email == "[email protected]").FirstOrDefault();
            usuario.Nome = "demo 1 atualizado";
            usuarioRepository.Update(usuario);

            //select list
            var usuariosComDemo = usuarioRepository.Where(a => a.Nome.Contains("demo")).ToList();

            //delecao do usuario
            usuarioRepository.Delete(usuario.Id);

            //delecao de todos os usuarios
            usuarioRepository.DeleteAll();
        }
    }

    public class Usuario : Entity
    {
        public string Nome { get; set; }
        public string Sobrenome { get; set; }
        public string Email { get; set; }
    }
}

Com isso já podemos ver os dados no MongoDB Alegre

image

Async

Esta biblioteca é extremamente útil, e como próximos passos, estou desenvolvendo a versão Async, com todas as implementações necessárias, assim que terminar vou tentar incorporar ao projeto original.

Espero que este post seja útil, estou a disposição para qualquer dúvida, critica ou sugestão

abs

Rodolfo

  • http://www.renatoms.net/ Renato Martins da Silva

    Alguma recomendação para documentos dinâmicos. Onde mesmo mesmo parte da coleção, eles tem campos completamente diferentes. Trabalhar com o bsondocument direto serializando, seria bom?

  • http://xamarinbr.azurewebsites.net/ Angelo Belchior

    Fazer o parse direto para uma entidade daria problema se vc tem vários tipos de documentos na coleção. Trabalhar com o bsondocument direto seria mais trabalhoso mas resolveria esse problema, já que seria algo como chave/valor