Comunidad de diseño web y desarrollo en internet online

Introducción a MongoDB

MongoDB es un sistema de bases de datos NoSQL orientado a documentos, a diferencia de MySQL, este no es una base de datos relacional. Es open source, lleva entre nosotros desde el 2009. Está escrito en C++ y tiene intención de aumentar la escalabilidad de un sistema. Es compatible con Linux, OS X, Windows y Solaris.

Además de MongoDB existen otros sistemas NoSQL como por ejemplo Cassandra, CouchDB, Redis, Riak, Membase, Neo4j y HBase.



Considera que mongoDB fue diseñado para ser un motor de búsqueda sobre aplicaciones en la nube, debes de ser bien específico al momento de elegir un sistema NoSQL. Esto porque tienen diferentes funciones o están optimizados para diferentes tareas: Como Cassandra que fue diseñado para búsquedas en Facebook.



Si buscas un framework en PHP para poder utilizar MongoDB inmediatamente puedes probar alguno de los siguientes: CakePHP, Codeigniter, Doctrine, Drupal, Kohana, Lithium, Memcached, Symfony 2, Yii y Zend Framework.

Si buscas utilizarlo con Python prueba con PyMongo.

Conceptos básicos


Una base de datos en MongoDB tiene diferentes conceptos a una base de datos regular como MySQL. Cada registro o unidad básica de datos se le denomina documento. Y cada conjunto de documentos, que formarían una tabla, se le llama colección.

Un documento se podría comprar con el concepto de fila y una colección a una tabla.

Organización y sistema


La ventaja que tiene MongoDB ante las bases de datos racionales es la velocidad de consulta. Esto se logra gracias a que los documentos son almacenados en formato BSON, que es una versión modificada del ya conocido JSON.

BSON pesa un poco más que un JSON regular, pero gracias a que este guarda longitudes de campos, índices de arrays, entre otras cosas, es mucho más rápido (y menos costoso), acceder a la información que se consulta.

Al final del día no vamos a ver el formato BSON, así que no te preocupes, siempre lo leerás como un JSON regular.

Documentos


Los documentos son un conjunto de claves con valores asociados. Sin embargo, cabe destacar que en cada lenguaje es diferente el "output".

Código :

{ "pepito" : "uno" }

Igual cabe destacar que una clave puede contener varios valores asociados como por ejemplo:

Código :

{ "pepito" : "uno", "dos" : 3 }


Notas importantes
- Las claves de un documento son strings.
- No se deben utilizar caracteres como punto y el signo de dólar.
- No deben de comenzar con guión bajo.
- Las claves son sensibles a mayúsculas y minúsculas.
- No debe contener claves duplicadas.
- Cada documento tiene una _id única generada a partir de diversos métodos, así siempre será diferente.

Colecciones


Una colección nos ayuda a organizarnos de manera mucho más fácil y rápida.

Código :

> db.pepito.insert()
> db.pepito.find()
> db.pepito.drop()


Notas importantes
- Mantener diferentes tipos de documentos en una misma colección es de masoquistas.
- Un string vacío no es un nombre válido, así como no se puede utilizar un string con signo de dolar.
- Es más rápido obtener una lista de documentos que mantengan la misma estructura.
- Siempre planea la estructura de tus colecciones y documentos antes de comenzar.

Manejo de datos desde la shell


Ya que este artículo es únicamente una introducción, no entraré en detalles de cómo instalarlo o utilizarlo con algún lenguaje. Únicamente desde la shell que viene por defecto o desde aquí (haciendo clic en "Try It Out")

Para hacer una inserción y guardarla escribimos lo siguiente para obtener algo parecido a pepito = tontito

Código :

db.pepito.save( { "pepito" : "tontito" } )

Y para imprimir el contenido

Código :

db.pepito.find()

El siguiente script inserta en el documento varios elementos en forma de tags, después usa una función para contar cada elemento con un foreach, separa los elementos y devuelve la cantidad de elementos en otro documento.

Código :

$ ./mongo
> db.things.insert( { _id : 1, tags : ['perro', 'gato'] } );
> db.things.insert( { _id : 2, tags : ['gato'] } );
> db.things.insert( { _id : 3, tags : ['raton', 'gato', 'perro'] } );
> db.things.insert( { _id : 4, tags : []  } );

> // función de mapeo
> m = function(){
...    this.tags.forEach(
...        function(z){
...            emit( z , { count : 1 } );
...        }
...    );
...};

> // función reductora
> r = function( key , values ){
...    var total = 0;
...    for ( var i=0; i<values.length; i++ )
...        total += values[i].count;
...    return { count : total };
...};

> res = db.things.mapReduce(m, r, { out : "myoutput" } );
> res
{
   "result" : "myoutput",
   "timeMillis" : 12,
   "counts" : {
      "input" : 4,
      "emit" : 6,
      "output" : 3
   },
   "ok" : 1,
}
> db.myoutput.find()
{"_id" : "gato" , "value" : {"count" : 3}}
{"_id" : "perro" , "value" : {"count" : 2}}
{"_id" : "raton" , "value" : {"count" : 1}}

> db.myoutput.drop()

Existen muchos más comandos, todos ellos están en la documentación, con el comando help, documentación o desde la shell de mongodb.org escribiendo tutorial para un rápido pero informativo tutorial.



¿Tienes dudas? Dejame un comentario aquí o sígueme en twitter @kinduff.

En el próximo tutorial les enseñaré como generar bases de datos, leerlas y modificarlas.

Enlaces de interés


- Página principal de mongoDB [link]
- Documentación mongoDB [link]
- Sourcecode + drivers para diferentes lenguajes y sistemas [link]
- NoSQL: If Only It Was That Easy [link]
- Cassandra vs MongoDB vs CouchDB vs Redis vs Riak vs HBase vs Membase vs Neo4j [link]
- [NSFW] Relational Database Vs NoSQL Fanbois [link]

¿Sabes SQL? ¿No-SQL? Aprende MySQL, PostgreSQL, MongoDB, Redis y más con el Curso Profesional de Bases de Datos que empieza el martes, en vivo.

Publica tu comentario

El autor de este artículo ha cerrado los comentarios. Si tienes preguntas o comentarios, puedes hacerlos en el foro

Entra al foro y participa en la discusión

o puedes...

¿Estás registrado en Cristalab y quieres
publicar tu URL y avatar?

¿No estás registrado aún pero quieres hacerlo antes de publicar tu comentario?

Registrate