Primeros pasos con MongoDB

De vez en cuando, leyendo blogs o webs de desarrollo software, te llama la atención alguna tecnología nueva (o no tan nueva) de la cuál te gustaría saber más. Esto es lo que me ha pasado con las bases de datos NoSQL. Desde que estoy metido en el mundillo de la informática siempre he trabajado con bases de datos relacionales (un poco de MySQL, un poco de Oracle y un mucho de SQL Server) y nunca había usado las bases de datos NoSQL. Ya desde hace algún tiempo, cada vez que oía algo de este tipo de bases de datos me ponía a pensar ¿cómo funcionará esto?

mongodb

Antes de meterme a investigar sobre este tipo de bases de datos mi primera impresión era que estaban aún muy verdes, una tecnología que todavía tenía mucho camino que andar para implantarse en sistemas profesionales y en empresas. Como veremos más adelante, estaba bastante equivocado.

Al comenzar con los primeros pasos de la investigación (que es lo que trató de plasmar en este post) estuve leyendo un poco de aquí y otro poco de allá sobre los cimientos de las bases de datos NoSQL y pronto decidí ponerme a cacharrear con una de las más conocidas, MongoDB. Una de las razones por la que elegí MongoDB fue el lema que encabeza su web, “Agile and Scalable”. Al verlo me dije: “voy a ver si esto es verdad”. Para mi sorpresa, y basándome en un acercamiento muy ligero, cumple con creces ambas características.

 

La instalación me resultó bastante confusa, pero eficiente. Yo que estoy acostumbrado al mundo Microsoft, esperaba un instalador (el típico setup.exe) en el que configurar 4 cosas y tener ya disponible una conexión con la que poder empezar a trabajar. Pero no, es bastante más fácil: la descarga es un archivo zip que contiene unos cuantos ejecutables que permiten arrancar el servicio, gestionar la administración y realizar conexiones a la base de datos. Todo por línea de comandos. Siguiendo los pasos del manual del MongoDB, en menos de un minuto tengo corriendo el gestor de base de datos con la configuración por defecto. Para mí esto ha sido suficiente para dar los primeros pasos. Tan solo hay que ejecutar:

mongod

Este comando arranca el gestor de base de datos sobre los ficheros de datos almacenados en la ruta “C:\data”. En mi caso, la ruta en la que quería que se guardasen los ficheros de datos es “C:\tests\MongoDB\data” por lo que se le tiene que pasar por línea de comandos al ejecutable, quedando:

mongod --dbpath "C:\tests\MongoDB\data"

A continuación, para acceder a un shell donde se pueden introducir comandos para operar en la base de datos, escribimos

mongo

Mediante este shell, en segundos, creo una base de datos sobre la que empezar a operar e inserto los primeros datos (suficientes para hacer las primeras lecturas en mi programa de prueba):

use testdb
db.testCollection.insert( { username : "pepe" } )
db.testCollection.insert( { username : "juan" } )

Siguiente paso: empezar a usar la base de datos desde de un programa de prueba desarrollado en C#. Para ello se necesita descargar un driver (también disponible en la web de MongoDB). Existen drivers para la mayoría de los lenguajes de programación más utilizados en la actualidad; para C# incluso existen ejemplos, herramientas de administración y enlaces a proyectos realizados por la comunidad de usuarios y a foros de ayuda. Aquí me di cuenta del grado de madurez que tiene MongoDB: las bases están bien sentadas sobre la teoría de las bases de datos NoSQL y existe, desde hace ya bastantes años, una comunidad implicada en desarrollar y facilitar el uso de este gestor de bases de datos. Una vez instalado el driver C#, el cual está desarrollado con el .NET Framework 3.5, ya tengo disponibles las dll’s para referenciar desde el proyecto de prueba y poder realizar la conexión a la base de datos. Me creo un sencillo programa de prueba con el que extraer el “username” de todos los documentos de la colección “testCollection”:

var mongoConnectionUrl = new MongoUrl("mongodb://localhost/testdb");
var collectionName = "testCollection";

var mongoClient = new MongoClient(mongoConnectionUrl);
var mongoServer = mongoClient.GetServer();
var db = mongoServer.GetDatabase(mongoConnectionUrl.DatabaseName);
var collection = db.GetCollection(collectionName);
foreach (var doc in collection.FindAll())
{
    Console.WriteLine(doc.GetElement("username").Value);
}

Como esperaba, el resultado es:

pepe
juan

Como vemos, en pocas líneas y en muy poco tiempo podemos ponernos a trabajar y obtener datos.

Para tener algo más de contenido sobre lo que poder probar (e inlcuso hacer alguna prueba de rendimiento frente a SQL Server) intenté migrar una tabla de precios (id, fecha, precio) de casi 70.000.000 de entradas, pero no he encontrado ningún programa que lo haga de forma rápida y eficiente. Finalmente, con un programa logré migrar unos 20.000.000 de entradas en todo un fin de semana que lo dejé arrancado. Debido a este problema de migración de datos, no he podido lanzar ninguna prueba de rendimiento fiable que enfrentase a MongoDB con SQLServer.
Lo que sí que pude hacer es una prueba de filtrado de datos y ordenación de los mismos y me encontré con una sintaxis bastante cómoda de usar frente a las sentencias SQL. Por ejemplo,

SELECT * FROM AdjustedPriceSeries WHERE SymbolId = 38669 AND Close > 5 ORDER BY Close

podría traducirse como:

var adjustedPriceSeries = db.GetCollection("AdjustedPriceSeries");
var query = Query.And(Query.EQ("SymbolId", 38669), Query.GT("Close", 5));
var sortBy = SortBy.Ascending("Close");
adjustedPriceSeries.Find(query).SetSortOrder(sortBy);

Por si resulta un poco extraño eso de EQ como “Equal” o GT como “GreaterThan”, el driver de MongoDB ofrece poder escribir sentencias LinQ de tal forma que las líneas anteriores pueden quedar como

var adjustedPriceSeries = db.GetCollection("AdjustedPriceSeries");
adjustedPriceSeries.AsQueryable<SymbolDateValue>().Where(x => x.SymbolId == 38669 && x.Close > 5).OrderBy(x => x.Close);

Hay que tener cuidado con el Select de LinQ, puesto que toma de base de datos todo un documento entero y después sobre éste filtra el dato que se selecciona con lo que la carga de información entre cliente y servidor se incrementa por cada campo de información que tenga el documento a recuperar. Espero que lo solucionen pronto, puesto que es razón suficiente como para no usar LinQ.
Como conclusión a este primer acercamiento a MongoDB me gustaría evaluar las dos características que MongoDB destaca en su web: Agile and Scalable.
En cuanto a “Agile” no he podido realizar una comparación de rendimiento con SQL Server como me hubiera gustado. Pero sí que puedo evaluar lo fácil, sencillo y rápido que me ha resultado empezar a usar la base de datos. En cuestión de pocos minutos ya estaba con ella arrancada y lanzando consultas de prueba. En cuanto a la escalabilidad, me ha sorprendido la cantidad de lenguajes de programación para los que existen drivers y, principalmente, la gran comunidad de usuarios que evolucionan continuamente MongoDB, ya sea con nuevos drivers o aplicaciones para la gestión de la base de datos.

 

Referencias:

https://www.mongodb.org/

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