MongoDB con Norm

Últimamente se ha puesto de moda las bases de datos NoSql y realmente es una buena alternativa si no necesitas una base de datos relacional y es mucho más potente que utilizar por ejemplo un fichero XML.

MongoDB es una base de datos documental no existe el concepto de tabla, solo contamos con colecciones de objetos en formato JSon y de código abierto. Una solución escalable y de alto rendimiento que nos permite trabajar con índices, replicación y alta disponibilidad. MongoDB está realizado en C++ pero su cliente soporta múltiples Drivers de lenguajes de programación, tanto por mongodb.org como por la comunidad de desarrolladores. Para .Net tiene drivers para C# y F#.

Para mis ejemplo utilizaré Norm un driver para C# que facilita la interacción con las colecciones, la serialización/deserialización de objetos JSOn como documentos “BSON” a tipos .NET y la utilización de LinQ-To-Mongo. Otra de las utilidades que he utilizado es mongoVUE para administrar nuestras bases de datos de una forma gráfica.

Vue

Con esta utilidad podéis ver los datos en formato árbol o en JSon.

Vue2

Vue3

La Instalación

La instalación es muy simple:

  1. Crear los directorios “C:MongoDBdata” y “C:MongoDBlogs”
  2. Copiar los ficheros de la instalación MongoDB
  3. En el directorio “C:MongoDBbin” ejecutar: “mongod –dbpath C:MongoDB\data –directoryperdb –install –logpath C:MongoDB\logs\log.txt” “En Windows 7, ejecutar el CMD como administrador para no tener problemas”
  4. Arrancar el servicio de MongoDB

image

El Modelo

Una de las ventajas de Norm es que podemos utilizar nuestras entidades sin necesidad de realizar grandes cambios, el único requerimiento es utilizar el objeto ObjectId para que MongoDb lo utilice como identificador de los registros.

[DataContract]
    public class Persona
    {
        public ObjectId Id { get; set; }
        [DataMember]
        public string Nombre { get; set; }
        [DataMember]
        public string Apellidos { get; set; }
        [DataMember]
        public DateTime Fecha { get; set; }
        [DataMember]
        public string Poblacion { get; set; }
        [DataMember]
        public int Hermanos { get; set; }
        [DataMember]
        public List Aficiones { get; set; }

    }
    [DataContract]
    public class Aficion
    {
         [DataMember]
        public string Nombre { get; set; }
         [DataMember]
        public string Descripcion { get; set; }
    }

La Conexión

Para conectar con nuestra base de datos tenemos que especificar el nombre de la base de datos, el servidor el puerto y un string con las opciones.

private Mongo mongo;
public RepositoyNomgoDB()
{
   mongo = new Mongo("EjMongoDB", "localhost", "27017", string.Empty);
}

Las Consultas

Para todas nuestras consultas podemos utilizar objetos anónimos o consultas LinQ. Lo primero que tenemos que hacer e obtener la colección que queremos utilizar, como si fuera una tabla de una base de datos relacional.

var collection = mongo.GetCollection<Personas>("Personas");

Una vez que tenemos la colección podemos utilizar las típicas sentencias CRUD.

collection.Insert(persona);
 collection.Delete(persona);
 collection.Save(persona);
 collection.UpdateOne(persona.Id, persona);

Ahora ya podemos realizar nuestras consultas utilizando la forma que nos sea más cómoda;

Buscar un Resultado:

//NoRM anonymous objects:
var persona = mongo.GetCollection&lt;Personas&gt;("Personas")
                             .FindOne(new { Nombre = "Marc" });
//NoRM Linq:
var personalinQ = mongo.GetCollection&lt;Personas&gt;("Personas")
                                                 .AsQueryable()
                                  .Where(per =&gt; per.Nombre == "Marc"
                                &amp;&amp; per.Apellidos == "Rubiño").ToList();

Buscar Varios Resultados o paginar los resultados:

//NoRM anonymous objects:
var persona = mongo.GetCollection&lt;Personas&gt;("Personas").Find(new { },
                                new { Fecha = OrderBY Computed;BY Computed;BY BY BY BY By.Descending }, 2, 1)
                                 .ToList();
//NoRM Linq:
var persona = mongo.GetCollection&lt;Personas&gt;("Personas").AsQueryable()
                                 .OrderByDescending(per =&gt; per.Fecha)
                                  .Skip(1)
                                  .Take(2).ToList();

Operadores Condicionales:

//Mayor que
var persona = mongo.GetCollection&lt;Personas&gt;("Personas").AsQueryable()
                            .Where(per =&gt; per.Hermanos &gt; 3).ToList();
//Igual o Mayor
var persona = mongo.GetCollection&lt;Personas&gt;("Personas").AsQueryable()
                             .Where(per =&gt; per.Hermanos &gt;= 3).ToList();
//Diferente
var persona = mongo.GetCollection&lt;Personas&gt;("Personas").AsQueryable()
                              .Where(per =&gt; per.Hermanos != 3).ToList();
//En
var persona = mongo.GetCollection&lt;Personas&gt;("Personas").Find(
                   new { Aficiones = Q.In("Futbol", "Música") }).ToList();
//NO En
var persona = mongo.GetCollection&lt;Personas&gt;("Personas").Find(
             new { Aficiones = Q.NotIn("Futbol", "Música") }).ToList();
//Existe
var persona = mongo.GetCollection&lt;Personas&gt;("Personas").Find(
                           new { Apellidos = Q.Exists(true) }).ToList();
//OR
var persona = mongo.GetCollection&lt;Personas&gt;("Personas")
                             .Find(Q.Or(new { Nombre = "Marc" },
                             new { Aficiones = "Futbol" })).ToList();

Distinto y Count:

//Count
 var persona = mongo.GetCollection&lt;Personas&gt;("Personas")
                        .COUNT(new { Poblacion = "Cambrils" }) as Computed;
//Distinct
var persona = mongo.GetCollection&lt;Personas&gt;("Personas")
                                 .Distinct("Aficiones");

Con expresiones Regulares:

//Empieza por Ma
 var persona = mongo.GetCollection&lt;Personas&gt;("Personas").AsQueryable()
                         .Where(per =&gt; Regex.IsMatch(per.Nombre, "^Ma"))
                          .ToList();

Ya podemos añadir y obtener los registros desde nuestra base de datos NoSql de Personas

Personas

Espero que en la próxima entrega pueda hacer un ejemplo más específico para una aplicación ASP.NET.

Anuncios

Responder

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión / Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión / Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión / Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión / Cambiar )

Conectando a %s