MongoDb .Net Series (III)


(Serie I)

(Serie II)

mongoDB-net.fw

 

En el anterior capítulo nos quedamos a punto de saber la diferencia entre una colección de MongoDb y una tabla de un gestor de SQL.

Bien, como ya sabéis, MongoDb es un gestor de bases de datos no relacionales o NoSql.

Bien, el concepto “no relacional”, implica que los datos no están estructurados, esto es, no tienen ni una estructura definida inicialmente, ni relaciones entre ellos. Esto, que podría parecer un despropósito, proporciona un nivel de velocidad de lectura y escritura desorbitados comparados con un gestor SQL. También permite al programador pensar directamente en objetos completos. Estos objectos completos, en terminología Mongo, se llaman Documentos.

Los documentos pueden tener las propiedades que se quiera, de hecho, pueden convivir en el mismo grupo o colección, documentos con diferente número y nombre de campos, a Mongo no le importa. Pues bien, ahí está, una colección, es un grupo de documentos. Si pensaramos en SQL, sería una tabla, pero con la rigidez del sistema, es decir, todos los registros tienen que tener el mismo número, nombre y tipo en los campos, hay campos obligatorios, etc. En una colección de Mongo, no existen estas restricciones. Piensa un momento en el follón que tienes que organizar cada vez que añades un campo en la base de datos. Pues en Mongo este follón se reduce a la mínima expresión.

Bien, después del rollo, vamos a ver un ejemplo. Como ya he dicho, un documento es un conjunto de propiedades, si lo pensamos en c#, podríamos asociar este documento a una clase.

Para simplificar el ejemplo, vamos a hacer una pequeña colección de electrodomésticos. Para ello, vamos, en nuestro programa, a definir una pequeña clase llamada Robot y otra pequeña clase llamada Reparación:

public class Robot
    {
        [BsonId(IdGenerator = typeof(CombGuidGenerator))]
        public Guid Id { get; set; }
        public string Nombre { get; set; }
        public string Marca { get; set; }
        public string Modelo { get; set; }
        public DateTime FechaDeCompra { get; set; }
        public bool EnGarantia { get; set; }
        public List<Reparacion> Reparaciones { get; set; } 
    }

    public class Reparacion
    {
        public DateTime Fecha { get; set; }
        public string Tecnico { get; set; }
        public string Descripcion { get; set; }
        public decimal Precio { get; set; }
    }

Como puedes ver, hemos añadido un atributo encima de la propiedad Id, esto va a hacer que auto-genere un Id.

Ahora vamos a decirle a nuestro programa que añada un robot a nuestra colección de Robots. Claro, te preguntarás, ¿pero ya?, ¿ya puedo insertar registros? La respuesta es sí. Cuando Mongo no encuentra la colección que estas intentando usar, la crea para ti.

Fíjate en como queda el programa:

    class Program
    {
        private const string ConnectionString = "mongodb://mongonetseriesuser:mongonetseriespassword@ds027748.mongolab.com:27748/mongonetseries";
        private const string DatabaseName = "mongonetseries";
        static void Main(string[] args)
        {
            var client = new MongoClient(ConnectionString);
            var server = client.GetServer();
            var database = server.GetDatabase(DatabaseName);

            var robotCollection = database.GetCollection<Robot>("Robots");
            var robot = new Robot
            {
                Marca = "Robotus",
                Modelo = "XS33",
                EnGarantia = false,
                FechaDeCompra = DateTime.Now.AddDays(-120),
                Nombre = "Mi robot",
                Reparaciones = new List<Reparacion>
                {
                    new Reparacion
                    {
                        Tecnico = "Pepe",
                        Descripcion = "No funciona",
                        Fecha = DateTime.Now.AddDays(-12),
                        Precio = 123.59
                    }
                }
            };
            robotCollection.Save(robot);

            Console.WriteLine("Robot salvado en la base de datos");
            Console.ReadKey();
        }
    }

Si te fijas en el código, verás que estamos obteniendo la colección de robots con esta línea:

var robotCollection = database.GetCollection<Robot>(“Robots”);

En ella le indicamos al driver que el nombre de la colección en MongoDb es o será Robots, y que va a almacenar objectos de la clase Robot.

Después puedes ver que simplemente instanciamos un objecto de la clase Robot (que contiene una lista de objetos de la clase Reparacion, y lo guardamos en su colección con la línea:

robotCollection.Save(robot);

Si abres el interfaz web de MongoLab, y miras dentro de la colección, verás que el objecto que nos ha creado es como este:

{
    "_id": {
        "$uuid": "4d603951-80c0-6a97-bf9f-5d0135a3c5b1"
    },
    "Nombre": "Mi robot",
    "Marca": "Robotus",
    "Modelo": "XS33",
    "FechaDeCompra": {
        "$date": "2014-01-24T22:12:45.266Z"
    },
    "EnGarantia": false,
    "Reparaciones": [
        {
            "Fecha": {
                "$date": "2014-05-12T21:12:45.268Z"
            },
            "Tecnico": "Pepe",
            "Descripcion": "No funciona",
            "Precio": 123.59
        }
    ]
}

Como podrás apreciar, se trata de un objeto JSON, concretamente, MongoDb guarda objetos BSON.

Hasta aquí cómo guardar documentos en MongoDb, como ves, es relativamente sencillo. En el próximo número, veremos como obtener esos documentos.

Anuncios

MongoDb .Net Series (II)


 

(Viene de MongoDb .Net Series (I)) (Sigue en MongoDb .Net Series (III))
mongoDB-net.fw

Como prometí en el post anterior, no voy a hablar más de infraestructura, sólo código.

Vamos a empezar por algo sencillo, vamos a crear una aplicación de consola y vamos a conectarnos desde ella a MongoDb.

Para ello, una vez creada tu aplicación de consola, haz click con el botón derecho en las referencias y selecciona “Manage NuGet Packages“.

Vamos a buscar un paquete que se llama, oh sorpresa, MongoDb:

installmongodriver

 

Selecciona el primer paquete de la lista, es decir, el driver oficial de MongoDb para C# y pulsa en Install y luego en I Accept. Cuando el sistema termine de instalar, pulsa en Close.

Si miras ahora la lista de referencias, verás que se te han añadido dos archivos nuevos:

MongoDB.Bson y MongoDB.Driver

Con esto tenemos suficiente para conectarnos a la base de datos que hemos creado en el post anterior.

Editamos nuestro Program con las siguientes líneas:


class Program
{
   private const string ConnectionString = "mongodb://mongonetseriesuser:mongonetseriespassword@ds027748.mongolab.com:27748/mongonetseries";
   private const string DatabaseName = "mongonetseries";
   static void Main(string[] args)
   {
      var client = new MongoClient(ConnectionString);
      var server = client.GetServer();
      var database = server.GetDatabase(DatabaseName);
      var collections = database.GetCollectionNames();
      foreach (var collection in collections)
      {
         Console.WriteLine(collection);
      }
      Console.WriteLine("Fin de lista de colecciones en la base de datos");
      Console.ReadKey();
   }
}

Si ejecutáis el programa, veréis que MongoDb ha creado dos colecciones en la base de datos llamadas:

system.indexes

y

system.users

Y, por el momento, lo dejamos aquí.

Ya sabemos crear una base de datos en la nube en un buen servicio y ya sabemos conectarnos a MongoDb desde .Net y obtener la lista de colecciones de la base de datos.

En el siguiente post, veremos lo que es una colección y su diferencia con una tabla en un sistema de base de datos SQL.

MongoDb .Net Series (I)


 

(Siguiente artículo)

 

Recientemente, en mi compañía hemos empezado un desarrollo nuevo y hemos seleccionado MongoDb como almacén de datos.

Al no tener mucha experiencia en bases de datos no sql, comencé a buscar información en internet, pero me encontré dos problemas: el primero, que no hay mucha documentación sobre desarrollo en MongoDb en castellano (excepto la proporcionada por la propia compañía), y el segundo, que la poca que hay no cubre el desarrollo con .net, se centra en Java, Php o Python.

Estoy acostumbrado (como la mayoría de vosotros supongo) a leer y estudiar en inglés, no es un problema para mí, pero estoy seguro de que hay mucha gente que agradecerá esta serie en castellano.

Dicho esto, al lío.

Vamos a empezar por lo más fácil, que es no tener que instalar la base de datos, para eso ya hay muchos tutoriales. Esta serie de posts se va a centrar en desarrollo puro y duro, no en infraestructura. Aún así, aquí tienes unas pequeñas líneas acerca de cómo crearte una base de datos inicial para seguir el tutorial (si es que así se le puede llamar).

Hay una empresa que proporciona servicio de MongoDb en la nube de manera gratuita, para desarrollo y pruebas es más que suficiente. La empresa se llama MongoLab, y es recomendable que para seguir el código aquí escrito, te registres y des de alta una base de datos.

Registrarse es de lo más sencillo, únicamente haz click en SignUp y rellena tus datos:

mongolabregister

 

 

 

 

Recibirás un correo de confirmación con diversos links para saber como trabajar con su MongoDb-as-a-Service.

Después de registrarte, se te mostrará una pantalla donde tienes un botón para crear una base de datos:

createnewmongolabCuando hagas click en Create New, te aparecerá otra ventana en la que puedes seleccionar:

El proveedor. Yo te recomiendo Windows Azure, pero sólo románticamente, siendo esta una serie de posts sobre .net, la verdad es que cualquier proveedor funciona realmente bien. Si seleccionas Windows Azure, la localización del DataCenter en que puedes seleccionar un nodo gratuito de desarrollo, es EastUS, si seleccionas otro DataCenter, solo tienes opciones de pago.

El Plan. Como ya he indicado, Si seleccionas Azure EastUs, puedes seleccionar Single-node(development), con lo que tendrás disponible una base de datos de hasta 0.5Gb gratis.

El nombre de la base de datos. En mi caso, voy a llamarla mongonetseries (recuerda poner tu nombre en minúsculas).

createdbmongolabDespués, solo tienes que pulsar en Create new MongoDB deployment y el sistema te creará todo lo que necesitas para empezar a utilizar MongoDB en tu aplicación.

 

 

 

 

 

A continuación, tras crear tu base de datos, el sistema te mostrará la lista de bases de datos que tienes, en teoría, sólo una.

Haz click en ella, pues enseguida te mostrará la cadena de conexión que necesitas usar desde tu aplicación.

connstringmongo

 

 

 

 

Y hasta aquí el primer post. Prometo que no volveré a mencionar la infraestructura en el resto de la serie.