Introducción a la base de datos NoSQL MongoDB

Escrito por el , actualizado el .
gnu-linux planeta-codigo programacion
Enlace permanente Comentarios

En unos pocos años las bases de datos NoSQL se han dado a conocer ampliamente. Resuelven algunas problemáticas para las que las bases de datos relacionales más longevas no proporcionan una solución totalmente satisfactoria como el escalado horizontal y un modelo de datos normalizado en varias tablas, filas y columnas predefinidas y significativamente diferente del modelo de datos usados por las aplicaciones. La base de datos NoSQL MongoDB que almacena documentos se adecua mejor a cierto tipo de requerimientos.

MongoDB

Los sistemas de información empleados tradicionalmente en las aplicaciones son las bases de datos relacionales como MySQL, PostgreSQL u otras comerciales. Las bases de datos relacionales con sus propiedades ACID seguirán usándose pero desde hace unos años están surgiendo y empleándose para algunos casos otro tipo de bases de datos conocidas como NoSQL. Dentro de las bases de datos NoSQL hay varios tipos: clave-valor, de documentos, grafos, … Dentro de la categoría de bases de datos NoSQL orientadas a almacenar documentos una de las más destacadas es MongoDB.

Al igual que las bases de datos relacionales MongoDB posee un shell JavaScript con el que lanzar todas las operaciones anteriores que junto con Docker la experimentación de todo lo anterior será una tarea no demasiado complicada. Bastará descargar la imagen de MongoDB para Docker, iniciar un contenedor, iniciar una shell bash en el contenedor y la shell de MongoDB desde la que lanzar las consultas. Siguiendo la seríe de artículos sobre Docker en unas pocas horas puedes usarlo.

1
2
3
4
mongodb:
  image: mongo:latest
  ports:
    - 27017:27017
docker-compose.yml
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
$ docker-compose up
$ docker ps
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                      NAMES
afc516c44901        mongo:latest        "docker-entrypoint..."   42 seconds ago      Up 41 seconds       0.0.0.0:27017->27017/tcp   mongodb_mongodb_1
$ docker exec -it afc516c44901 bash
root@afc516c44901:/# mongo
connecting to: mongodb://127.0.0.1:27017
MongoDB server version: 3.4.4
Welcome to the MongoDB shell.
For interactive help, type "help".
For more comprehensive documentation, see
	http://docs.mongodb.org/
Questions? Try the support group
	http://groups.google.com/group/mongodb-user
>
docker-compose.sh

La base de datos MongoDB al igual que muchas NoSQL no soporta completamente las propiedades ACID de las bases de datos relacionales, no soporta transacciones aunque sí garantiza que las operaciones individuales son atómicas, pero a cambio proporciona otras propiedades que para algunas necesidades podemos considerar más adecuadas como mayor escalabilidad horizontal, alta disponibilidad, réplicas y shards para distribuir los datos entre varias instancias. MongoDB guarda la información en documentos con formato JSON.

En vez de tablas, filas y columnas los términos en MongoDB son colecciones de documentos, los documentos son la unidad mínima de información almacenable y propiedades en esos documentos. Una propiedad interesante de los documentos es que estos no tiene porque tener todos las mismas propiedades, aunque se recomienda que las propiedades sean siempre del mismo tipo. Los documentos hacen menos necesarios y complejos los ORM para convertir del modelo relacional usado en las bases de datos al modelo de objetos de la aplicación.

1
2
{title: "Introducción a la base de datos NoSQL MongoDB", author: "picodotdev", date: new Date(2017,05,18,12,30), tags: ['mongodb', 'database', 'NoSQL'], comments: [{user: "jones", message: "MongoDB is great!"}, {user: "lina", message: "NoSQL is amazing!"}]}
{title: "Introducción a la base de datos relacional PostgreSQL", author: "picodotdev", date: new Date(2017,05,17,12,00), likes: 100, tags: ['postgresql', 'database', 'SQL'], comments: [{user: "katy", message: "PostgreSQL rocks!"}, {user: "smith", message: "SQL language is powerful!"}]}
documents.json

Se pueden almacenar los documentos anteriores en la misma colección de artículos aunque ambos no tengan las mismas propiedades, en una base de datos relacional sería más complicado y en el caso de que los datos fuesen desconocidos en el momento de definir el modelo obligaría a usar el modelo entity-atribute-value.

La información que en una base de datos relacional está en varias tablas y es necesario realizar varias consultas SQL para obtenerla en MongoDB está en un mismo documento siendo más sencilla de recuperar con la posibilidad de no estar tan normalizada y sin necesidad de hacer joins entre varias tablas. Para guardar los documentos anteriores de ejemplo en una base de datos relacional se necesitan varias tablas, una para los artículos y otras para los comentarios, etiquetas y adicionales para las relaciones N a M.

Algunas bases de datos NoSQL no necesitan del potente lenguaje de consulta SQL de las bases de datos relacionales pero MongoDB proporciona su propio lenguaje de consulta diferente a SQL pero con muchas funcionalidades similares: proyecciones, agrupaciones, filtrado, agregación, ordenación, funciones lógicas, aritméticas, para fechas, para cadenas además de operaciones para realizar inserciones, actualizaciones de un documento completo o campos individuales y eliminaciones. Para que las búsquedas y filtrados tenga buen rendimiento en colecciones de documentos grandes también se pueden crear índices.

Estas son las operaciones CRUD ejecutadas desde la shell de MongoDB en una colección de artículos.

1
2
3
4
> db.articles.insert({title: "Introducción a la base de datos NoSQL MongoDB", author: "picodotdev", date: new Date(2017,05,18,12,30), tags: ['mongodb', 'database', 'NoSQL'], comments: [{user: "jones", message: "MongoDB is great!"}, {user: "lina", message: "MongoDB is great!"}]})
WriteResult({ "nInserted" : 1 })
> db.articles.insert({title: "Introducción a la base de datos relacional PostgreSQL", author: "picodotdev", date: new Date(2017,05,17,12,00), likes: 100, tags: ['postgresql', 'database', 'SQL'], comments: [{user: "katy", message: "PostgreSQL rocks!"}, {user: "smith", message: "SQL language is powerful!"}]})
WriteResult({ "nInserted" : 1 })
insert.json
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
> db.articles.find()
{ "_id" : ObjectId("592a9e5c7ea530bbaf886179"), "title" : "Introducción a la base de datos NoSQL MongoDB", "author" : "picodotdev", "date" : ISODate("2017-06-18T12:30:00Z"), "tags" : [ "mongodb", "database", "NoSQL" ], "comments" : [ { "user" : "jones", "message" : "MongoDB is great!" }, { "user" : "lina", "message" : "MongoDB is great!" } ] }
{ "_id" : ObjectId("592a9e687ea530bbaf88617a"), "title" : "Introducción a la base de datos relacional PostgreSQL", "author" : "picodotdev", "date" : ISODate("2017-06-17T12:00:00Z"), "likes" : 100, "tags" : [ "postgresql", "database", "SQL" ], "comments" : [ { "user" : "katy", "message" : "PostgreSQL rocks!" }, { "user" : "smith", "message" : "SQL language is powerful!" } ] }

> db.articles.count()
2

> db.articles.find({author: "picodotdev"})
{ "_id" : ObjectId("592a9e5c7ea530bbaf886179"), "title" : "Introducción a la base de datos NoSQL MongoDB", "author" : "picodotdev", "date" : ISODate("2017-06-18T12:30:00Z"), "tags" : [ "mongodb", "database", "NoSQL" ], "comments" : [ { "user" : "jones", "message" : "MongoDB is great!" }, { "user" : "lina", "message" : "MongoDB is great!" } ] }
{ "_id" : ObjectId("592a9e687ea530bbaf88617a"), "title" : "Introducción a la base de datos relacional PostgreSQL", "author" : "picodotdev", "date" : ISODate("2017-06-17T12:00:00Z"), "likes" : 100, "tags" : [ "postgresql", "database", "SQL" ], "comments" : [ { "user" : "katy", "message" : "PostgreSQL rocks!" }, { "user" : "smith", "message" : "SQL language is powerful!" } ] }
find.json
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
> db.articles.update({"_id": ObjectId("592a9e5c7ea530bbaf886179")}, {$set: {author: "pico.dev"}})
WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })

> db.articles.find()
{ "_id" : ObjectId("592a9e5c7ea530bbaf886179"), "title" : "Introducción a la base de datos NoSQL MongoDB", "author" : "pico.dev", "date" : ISODate("2017-06-18T12:30:00Z"), "tags" : [ "mongodb", "database", "NoSQL" ], "comments" : [ { "user" : "jones", "message" : "MongoDB is great!" }, { "user" : "lina", "message" : "MongoDB is great!" } ] }
{ "_id" : ObjectId("592a9e687ea530bbaf88617a"), "title" : "Introducción a la base de datos relacional PostgreSQL", "author" : "picodotdev", "date" : ISODate("2017-06-17T12:00:00Z"), "likes" : 100, "tags" : [ "postgresql", "database", "SQL" ], "comments" : [ { "user" : "katy", "message" : "PostgreSQL rocks!" }, { "user" : "smith", "message" : "SQL language is powerful!" } ] }

> db.articles.update({"_id": ObjectId("592a9e5c7ea530bbaf886179")}, {$addToSet: {"tags": "programming"}}, false, true)
WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })

> db.articles.find({"_id": ObjectId("592a9e5c7ea530bbaf886179")})
{ "_id" : ObjectId("592a9e5c7ea530bbaf886179"), "title" : "Introducción a la base de datos NoSQL MongoDB", "author" : "pico.dev", "date" : ISODate("2017-06-18T12:30:00Z"), "tags" : [ "mongodb", "database", "NoSQL", "programming" ], "comments" : [ { "user" : "jones", "message" : "MongoDB is great!" }, { "user" : "lina", "message" : "MongoDB is great!" } ] }
update.json
1
2
3
4
5
> db.articles.remove({"_id": ObjectId("592a9e5c7ea530bbaf886179")})
WriteResult({ "nRemoved" : 1 })

> db.articles.count()
1
delete.json

MongoDB proporciona controladores para acceder a la base de datos desde los lenguajes de programación más populares como muestro en el artículo Usar la base de datos NoSQL MongoDB con Java.

El libro MongoDB in Action es un buen material de referencia para dominar esta base de datos NoSQL con consejos prácticos de como guardar la información y como administrar la base de datos para replicar los datos en un cluster, escalar y otros temas administrativos como crear copias de seguridad, rendimiento, seguridad o monitorización.

La base de datos PostgreSQL es una de las mejores opciones en el ámbito de las bases de datos relacionales y el potente lenguaje SQL, las propiedades ACID o el PL/pgSQL entre otras funcionalidades hará que siga siendo una de las mejores opciones para almacenar de forma persistente la preciosa información. En los casos que la escalabilidad o la estructuración de la información en documentos se un factor determinante MongoDB es una buena opción. Ambas opciones no son excluyentes, según el caso estos dos sistemas de información se podrán combinar para obtener lo mejor de cada uno de ellos.


Comparte el artículo: