MongoDB: Introducción

En esta entrada se hablará sobre MongoDB, base de datos NoSQL líder en el mercado. El objetivo es dar a conocer las ventajas de esta base de datos y sus características generales.

¿Qué es MongoDB?

MongoDB es una base de datos NoSQL orientada a documentos. A diferencia de las bases de datos relacionales, donde se almacenan los registros como filas de una tabla, con MongoDB estos registros son almacenados en documentos BSON (un derivado de los documentos JSON).

MongoDB presenta las siguientes ventajas:

Uso de esquema flexible No existe esquema, por lo que cada documento podría tener una estructura distinta
Escalabilidad horizontal En MongoDB se puede crear un cluster donde la información estará particionada y replicada lo que permite poder escalar nuestro sistema horizontalmente en base a la demanda
Software Open Source MongoDB es una base de datos de código abierto y gratuita con una gran comunidad muy involucrada

En esta entrada repasaremos los conceptos básicos presentes en MongoDB: Los documentos, las colecciones y las bases de datos.

Documents

Los documentos son el corazón de MongoDB. Se trata de un conjunto ordenado de claves con su correspondiente valor. Un documento sería similar a una fila en un sistema RDBMS pero sin la imposición de un esquema fijo. A continuación se muestra la estructura básica de un documento en MongoDB donde la primera parte corresponde a la clave y la segunda al valor.

{"saludo": "Hola mundo!"}

 

Las claves en MongoDB son Strings con formato UTF-8 que tienen las siguientes restricciones:

Restricciones de los Strings No pueden contener el carácter null (/0)
Los caracteres “.” y “$” son caracteres especiales que serán usados en casos especiales
No pueden existir claves duplicadas dentro de un mismo documento

 

Los valores en MongoDB no son solo simples Strings. MongoDB tiene varios tipos de datos permitidos en los valores de sus documentos:

Otro tipo de datos permitidos Null: Puede ser usado para representar un valor nulo o un campo no existente
Boolean: true o false
Number: Por defecto se usa 64-bits en punto flotante
NumberInt, NumberLong: Para enteros con representación 4-bytes o 8-bytes
String
Date: el TimeZone no se almacena
Expresiones regulares: Los valores pueden contener expresiones regulares y además estas también pueden ser usadas en las queries
Array: Conjunto de valores que puede tener distintos tipos de datos
Documento embebido: Documentos como valores de una clave
ObjectId
Datos binarios
Código: Las queries y los documentos pueden contener código javascript

 

En el ejemplo siguiente se puede ver cómo las claves «edad», «amigos» y «enemigos» están tomando valores del tipo NumberInt; «nombre» un valor del tipo String y «relaciones» tiene asignado un documento embebido. Además, se crea un _id con un ObjectId.

{
 "_id" : ObjectId("4b2b9f67a1f631733d917a7a"),
 "nombre" : "joe",
 "edad": 30,
 "relaciones" : {
 "amigos" : 32,
 "enemigos" : 2
 }
}

 _id y ObjectsIds

Los _id son el identificador propio de un documento. Este puede ser de cualquier tipo pero MongoDB utiliza por defecto un ObjectId. Este identificador debe de ser único para cada collection (conjunto de documentos).

ObjectId es el tipo por defecto para los _id. No son pesados, son fáciles de generar y globalmente únicos entre las distintas máquinas del cluster. MongoDB utiliza ObjectId en lugar de autoincrementales por su carácter distribuido y es que un autoincremental consume más tiempo y recursos para su sincronización.

ObjectIds utiliza 12 bytes, lo que son 24 caracteres hexadecimales.

objectid

  • El timestamp formado por los primeros 5 bytes, provee granularidad única por segundo. Al estar primero el timestamp, los objectId están ordenados por tiempo creación
  • Los siguientes 3 bytes identifican la máquina donde fue generado el id
  • Y los siguientes 2 bytes identifican el proceso por el que fue generado (y así poder tener procesos concurrentes generando distintos ObjectIds)
  • Los últimos 3 bytes son responsables de asegurar la generación de ids únicos en cada segundo a lo largo del cluster

Si no existe un _id presente en el documento a insertar, uno será generado e insertado automáticamente.

Collections

Una colección es un conjunto de documentos y podría identificarse con una tabla en un sistema RDBMS con la particularidad de que no existe un esquema fijo. Esto permite que en una colección se puedan almacenar documentos con esquemas distintos.
Al poderse almacenar cualquier tipo de documento, una primera aproximación podría ser la del uso de una única colección.

Esto no sería lo más indicado y es recomendable el uso de múltiples colecciones por los siguientes motivos:

  • El almacenamiento de distintos documentos en una única colección acabaría siendo un cajón desastre difícil de mantener y de utilizar
  • Es más eficiente buscar documentos que están separados en distintas colecciones
  • Agrupar documentos que son del mismo tipo permite una mejor eficiencia en la localización de datos
  • La creación de índices impone finalmente una estructura a nuestra colección

Databases

Es posible agrupar colecciones en databases, pudiendo disponer de varias databases en un mismo host.
Cada database tiene sus permisos propios y está almacenada en ficheros separados del disco. Todos los datos de una misma aplicación, deberían estar almacenados en la misma base de datos.

MongoDB es un buen sistema de almacenamiento que combina características como la escalabilidad horizontal, esquema flexible y open source, haciendo de ésta, una de las bases de datos más utilizada en la actualidad.

En posteriores entradas, se analizará en profundidad aspectos como la arquitectura, lenguaje de queries, etc.