Ú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.
Con esta utilidad podéis ver los datos en formato árbol o en JSon.
La Instalación
La instalación es muy simple:
-
Crear los directorios «C:MongoDBdata» y «C:MongoDBlogs»
-
Copiar los ficheros de la instalación MongoDB
- 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”
- Arrancar el servicio de MongoDB
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.
[sourcecode language=»csharp»]
[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; }
}
[/sourcecode]
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.
[sourcecode language=»csharp»]
private Mongo mongo;
public RepositoyNomgoDB()
{
mongo = new Mongo("EjMongoDB", "localhost", "27017", string.Empty);
}
[/sourcecode]
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.
[sourcecode language=»csharp»]
collection.Insert(persona);
collection.Delete(persona);
collection.Save(persona);
collection.UpdateOne(persona.Id, persona);
[/sourcecode]
Ahora ya podemos realizar nuestras consultas utilizando la forma que nos sea más cómoda;
Buscar un Resultado:
[sourcecode language=»csharp»]
//NoRM anonymous objects:
var persona = mongo.GetCollection<Personas>("Personas")
.FindOne(new { Nombre = "Marc" });
//NoRM Linq:
var personalinQ = mongo.GetCollection<Personas>("Personas")
.AsQueryable()
.Where(per => per.Nombre == "Marc"
&& per.Apellidos == "Rubiño").ToList();
[/sourcecode]
Buscar Varios Resultados o paginar los resultados:
[sourcecode language=»csharp»]
//NoRM anonymous objects:
var persona = mongo.GetCollection<Personas>("Personas").Find(new { },
new { Fecha = OrderBY Computed;BY Computed;BY BY BY BY By.Descending }, 2, 1)
.ToList();
//NoRM Linq:
var persona = mongo.GetCollection<Personas>("Personas").AsQueryable()
.OrderByDescending(per => per.Fecha)
.Skip(1)
.Take(2).ToList();
[/sourcecode]
Operadores Condicionales:
[sourcecode language=»csharp»]
//Mayor que
var persona = mongo.GetCollection<Personas>("Personas").AsQueryable()
.Where(per => per.Hermanos > 3).ToList();
//Igual o Mayor
var persona = mongo.GetCollection<Personas>("Personas").AsQueryable()
.Where(per => per.Hermanos >= 3).ToList();
//Diferente
var persona = mongo.GetCollection<Personas>("Personas").AsQueryable()
.Where(per => per.Hermanos != 3).ToList();
//En
var persona = mongo.GetCollection<Personas>("Personas").Find(
new { Aficiones = Q.In("Futbol", "Música") }).ToList();
//NO En
var persona = mongo.GetCollection<Personas>("Personas").Find(
new { Aficiones = Q.NotIn("Futbol", "Música") }).ToList();
//Existe
var persona = mongo.GetCollection<Personas>("Personas").Find(
new { Apellidos = Q.Exists(true) }).ToList();
//OR
var persona = mongo.GetCollection<Personas>("Personas")
.Find(Q.Or(new { Nombre = "Marc" },
new { Aficiones = "Futbol" })).ToList();
[/sourcecode]
Distinto y Count:
[sourcecode language=»csharp»]
//Count
var persona = mongo.GetCollection<Personas>("Personas")
.COUNT(new { Poblacion = "Cambrils" }) as Computed;
//Distinct
var persona = mongo.GetCollection<Personas>("Personas")
.Distinct("Aficiones");
[/sourcecode]
Con expresiones Regulares:
[sourcecode language=»csharp»]
//Empieza por Ma
var persona = mongo.GetCollection<Personas>("Personas").AsQueryable()
.Where(per => Regex.IsMatch(per.Nombre, "^Ma"))
.ToList();
[/sourcecode]
Ya podemos añadir y obtener los registros desde nuestra base de datos NoSql de Personas
Espero que en la próxima entrega pueda hacer un ejemplo más específico para una aplicación ASP.NET.