MongoDB: qué es, cómo funciona y cuándo podemos usarlo (o no)
0 COMENTARIOS
SUSCRÍBETE A GENBETA
Recibe un email al día con nuestros artículos:
SUSCRIBIRSíguenos
PUBLICIDAD
TE RECOMENDAMOS
La actualización de mayo 2019 de Windows 10 necesitará más espacio en disco que cualquier otra
Esto es lo que pasa cuando intentas medir la productividad de un programador por las líneas de código que escribe al día
Qué webs están bloqueadas por Movistar, Orange y Vodafone en España
PUBLICIDAD
3 Febrero 2014RUBENFA@_rubenfa
Dentro de las bases de datos NoSQL, probablemente una de las más famosas sea MongoDB. Con un concepto muy diferente al de las bases de datos relacionales, se está convirtiendo en una interesante alternativa.
Pero cuándo uno se inicia en MongoDB se puede sentir perdido. No tenemos tablas, no tenemos registros y lo que es más importante, no tenemos SQL. Aun así, MongoDB es una seria candidata para almacenar los datos de nuestras aplicaciones.
A lo largo de una serie de artículos vamos a explicar como funciona esta base de datos NoSQL, qué podemos hacer con ella, y cómo podemos hacerlo. Empezamos.
¿Qué es MongoDB?
En un artículo anterior ya hablamos sobre MongoDB. Recordemos. MongoDB es una base de datos orientada a documentos. Esto quiere decir que en lugar de guardar los datos en registros, guarda los datos en documentos. Estos documentos son almacenados en BSON, que es una representación binaria de JSON.
Una de las diferencias más importantes con respecto a las bases de datos relacionales, es que no es necesario seguir un esquema. Los documentos de una misma colección - concepto similar a una tabla de una base de datos relacional -, pueden tener esquemas diferentes.
Imaginemos que tenemos una colección a la que llamamos Personas. Un documento podría almacenarse de la siguiente manera:{ Nombre: "Pedro", Apellidos: "Martínez Campo", Edad: 22, Aficiones: ["fútbol","tenis","ciclismo"], Amigos: [ { Nombre:"María", Edad:22 }, { Nombre:"Luis", Edad:28 } ] }
El documento anterior es un clásico documento JSON. Tiene strings, arrays, subdocumentos y números. En la misma colección podríamos guardar un documento como este:{ Nombre: "Luis", Estudios: "Administración y Dirección de Empresas", Amigos:12 }
Este documento no sigue el mismo esquema que el primero. Tiene menos campos, algún campo nuevo que no existe en el documento anterior e incluso un campo de distinto tipo.
Esto que es algo impensable en una base de datos relacional, es algo totalmente válido en MongoDB.
¿Cómo funciona MongoDB?
MongoDB está escrito en C++, aunque las consultas se hacen pasando objetos JSON como parámetro. Es algo bastante lógico, dado que los propios documentos se almacenan en BSON. Por ejemplo:db.Clientes.find({Nombre:"Pedro"});
La consulta anterior buscará todos los clientes cuyo nombre sea Pedro.
MongoDB viene de serie con una consola desde la que podemos ejecutar los distintos comandos. Esta consola está construida sobre JavaScript, por lo que las consultas se realizan utilizando ese lenguaje. Además de las funciones de MongoDB, podemos utilizar muchas de las funciones propias de JavaSciprt. En la consola también podemos definir variables, funciones o utilizar bucles.
Si queremos usar nuestro lenguaje de programación favorito, existen drivers para un gran número de ellos. Hay drivers oficiales para C#, Java, Node.js, PHP, Python, Ruby, C, C++, Perl o Scala. Aunque estos drivers están soportados por MongoDB, no todos están en el mismo estado de madurez. Por ejemplo el de C es una versión alpha. Si queremos utilizar un lenguaje concreto, es mejor revisar los drivers disponibles para comprobar si son adecuados para un entorno de producción.
¿Dónde se puede utilizar MongoDB?
Aunque se suele decir que las bases de datos NoSQL tienen un ámbito de aplicación reducido, MongoDB se puede utilizar en muchos de los proyectos que desarrollamos en la actualidad.
Cualquier aplicación que necesite almacenar datos semi estructurados puede usar MongoDB. Es el caso de las típicas aplicaciones CRUD o de muchos de los desarrollos web actuales.
Eso sí, aunque las colecciones de MongoDB no necesitan definir une esquema, es importante que diseñemos nuestra aplicación para seguir uno. Tendremos que pensar si necesitamos normalizar los datos, denormalizarlos o utilizar una aproximación híbrida. Estas decisiones pueden afectar al rendimiento de nuestra aplicación. En definitiva el esquema lo definen las consultas que vayamos a realizar con más frecuencia.
MongoDB es especialmente útil en entornos que requieran escalabilidad. Con sus opciones de replicación y sharding, que son muy sencillas de configurar, podemos conseguir un sistema que escale horizontalmente sin demasiados problemas.
¿Dónde no se debe usar MongoDB?
En esta base de datos no existen las transacciones. Aunque nuestra aplicación puede utilizar alguna técnica para simular las transacciones, MongoDB no tiene esta capacidad. Solo garantiza operaciones atómicas a nivel de documento. Si las transacciones son algo indispensable en nuestro desarrollo, deberemos pensar en otro sistema.
Tampoco existen los JOINS. Para consultar datos relacionados en dos o más colecciones, tenemos que hacer más de una consulta. En general, si nuestros datos pueden ser estructurados en tablas, y necesitamos las relaciones, es mejor que optemos por un RDBMS clásico.
Y para finalizar, están las consultas de agregación. MongoDB tiene un framework para realizar consultas de este tipo llamado Aggregation Framework. También puede usar Map Reduce. Aún así, estos métodos no llegan a la potencia de un sistema relacional. Si vamos a necesitar explotar informes complejos, deberemos pensar en utilizar otro sistema. Eso sí, esta es una brecha que MongoDB va recortando con cada versión. En poco tiempo esto podría dejar de ser un problema.
¿Cómo se instala MongoDB?
La instalación de una instancia del servidor es un juego de niños. Simplemente tenemos que bajar los binarios para nuestro sistema operativo. Hay versiones par Windows, Linux y MacOs. Una vez bajados podremos arrancar el servicio de MongoDB con un solo comando.mongod --dbpath data
Con este comando arrancamos el servicio mongod, que empezará a escuchar peticiones por el puerto 27017. Es importante indicar el parámetro --dbpath, con la ruta dónde se almacenarán los ficheros de nuestra base de datos.
¿Cómo puedo usar la consola?
Si ya tenemos el servidor lanzado en nuestra máquina, bastará con lanzar desde la consola el siguiente comandomongo localhost
Desde ese momento entraremos en la consola y podremos realizar consultas. Si escribimos help tendremos un listado con los comandos más comunes y su descripción.
Y de momento lo dejamos aquí. En próximos artículos veremos como se pueden hacer inserciones, consultas y actualizaciones de datos.
Mongodb es una base de datos No SQL orientada a documentos (BSON/JSON). Para poder entender por qué mongodb es NoSQL es necesario saber qué es SQL.
SQL significa Structured Query Language o lenguaje de consultas estructurado. SQL permite almacenar datos basándose en un concepto matemático llamado álgebra relacional, por lo que también se las conoce a las base SQL como bases de datos relacionales. Son relacionales, ya que utilizan las relaciones entre conjuntos (tablas) para filtrar los datos que se necesiten para determinada situación.
Debido a que los problemas evolucionaron, las soluciones y los sistemas también. Hay situaciones donde el uso de SQL es problemático o por lo menos no se adapta a ciertos escenarios. Uno de los casos más evidentes es en las aplicaciones real time.
Un escenario No SQL
Hacemos una app que utilice la API de Twitter con una base SQL para hacer estadísticas. Nuestra app funciona unos meses y de repente deja de funcionar, investigamos qué pasó y nos damos cuenta de que twitter cambió el objeto tweet y la base de datos rechazaba el insert en la tabla tweets. Pese a que se puede hacer bien el sistema con la base SQL, no es lo más natural, ya que no es fluido.
Source: techwomenc
Un tweet puede cambiar con el paso del tiempo. Twitter no te va a notificar cada vez que hace un cambio, o por lo menos tu aplicación no debería contar con eso. Por ende, si quisieras que tu sistema soporte el almacenamiento de tweets constantemente, sin romper el programa, podrías utilizar una base de datos No SQL y almacenar los documentos JSON tal cual vienen desde la API de twitter.
1. ¿ Qué es Mongodb?
Mongodb es una base de datos orientada a documentos. Esto significa que almacena objetos de tipo JSON (técnicamente Binary JSON). Y está basada en el motor V8 de google (chrome), permite realizar operaciones (insert, update, remove,etc) con javascript. Esto hace que mongodb sea gran candidato a ser la db de una aplicación web donde todas las capas son con JavaScript.
También se puede utilizar con otros lenguajes como Java y .Net con sus respectivos drivers.
2. Sus principales características
- Almacena documentos JSON (Binary JSON)
- Es Schemaless
- Se ejecutan operaciones con JavaScript
- Posee tolerancia a fallos, clustering, réplicas
- Es No SQL
3. Mongodb es Schemaless
No tener schema significa que no hay una estructura fija que le de forma a los documentos que almacenamos, estos pueden tener diferentes esquemas y pueden variar sus propiedades. Si bien esto es una gran ventaja, tampoco hay que abusar de ella porque nuestra base deja de ser eficiente al momento de realizar búsquedas.
Por ejemplo, un tweet puede variar en que tenga o no geo localización, pero siempre va a tener un id de usuario, un texto y una imagen asociada. El esquema varía pero la escencia es la misma.
4. Practiquemos: Hagamos un CRUD
Empecemos con algo de práctica. Para conocer las operaciones de mongodb podemos hacer un CRUD (CREATE, READ, UPDATE, DELETE).
A. CREATE
Para almacenar datos en mongodb es necesario crear una base de datos. Para ello abrimos la terminal y ejecutamos el comando mongo. Si todavía no instalaste Mongo en tu computadora, ¡es un gran momento para hacerlo! Encuentra cómo hacerlo para tu sistema operativo acá
Para crear una base de datos, solo hace falta ejecutar el comando use
En este caso creamos una base que se llama travel.
Una vez que tenemos la base de datos, es necesario crear una collection para almacenarlos. Una collection es una entidad que contiene un conjunto de objetos JSON o documentos.
Por el simple hecho de insertar un documento, se crea una collection.
<code>> db.hotels.insert({name:"Hotel Prueba", stars:5, location:{ city: "Buenos Aires",geo:{ long:-72.
27049999999997, lat:-50.3402} }, checkin:"11:00pm",checkout:"15:00pm" });</code>
El comando es insert y la estructura es la siguiente:
<code>db.collection.operation(objects)</code>db.hotels.insert({...})
Almacena en la db travel, collection hotels un documento JSON que representa a un hotel.
B. READ
Los hoteles en esta collection pueden ser diferentes, algunos pueden tener más propiedades. Como por ejemplo, información acerca de sus amenities, restaurante, spa. También podría tener imágenes de sus habitaciones, tipos de habitaciones, etc.
Para consultar el hotel insertado seguimos la misma estructura, db.collection.operation()
En este caso podemos hacer una consulta que nos devuelva todos los hoteles.
<code>db.hotels.find()</code>
Este comando trae todos los documentos de la collection y si quisiera podría pedir todos los hoteles 5 estrellas. Para ello puedo ejecutar la siguiente consulta.
<code>db.hotels.find({stars:5})</code>
Como se ve en la consulta, es un simple JSON. {stars:5} significa que buscará todos los objetos donde coincida que la propiedad stars sea igual a 5.
Si necesito hacer una consulta un poco más exigente, puedo consultar por ejemplo, todos los hoteles de 3 estrellas o más. Para esto, es necesario utilizar operadores, como >=(mayor igual), <=(menor igual), !(not).
<code>db.hotels.find( {stars: {$gte:3}} )</code>
Si quiero agregar más condiciones, solo hay que colocar las propiedades que quiero filtrar. Si quiero todos los hoteles mayores de 3 estrellas y que estén en Buenos Aires, tendría que hacer la siguiente consulta.
<code>db.hotels.find( {stars: {$gte:3}, "location.city":"Buenos Aires" } )</code>
Hay otro detalle a tener en cuenta, la ciudad es una propiedad dentro de un objeto, por eso hay que colocar el path de la propiedad que quiero filtrar. “location.city” (entre comillas dobles), es el path de la ciuidad del hotel.
Un objeto JSON puede contener propiedades de valores primitivos (strings, integers, boolean), otros objetos y arrays.
C. UPDATE
Mongodb permite consultar elementos dentro de los arrays que pertenecen a un objeto. En mongodb no se puede almacenar un array directamente, siempre tiene que pertenecer a un objeto.
Para operar con arrays existen operadores como $in, $push, $pop, $addToSet que permite hacer operaciones similares a las que se hacen con cualquier lenguaje de programación.
Para agregar propiedades a un documento que existe en la collection, es necesario ejecutar la operación update. La estructura de esta es la siguiente:
<code>db.collection.update({query}, {update},{options})</code>
Agreguemos un array que contenga los tipo de habitaciones del hotel al hotel que insertamos previamente y el comando sería el siguiente:
<code>db.hotels.update({"_id" : ObjectId("56a62092f1ec5d6ee655f889")},{rooms: [{ name: "Habitación
Estandar", max:2, amenities:['Aire Acondicionado','TV','WIFI'] , category:"Standard" }] })</code>
Al ejecutar el update podemos ver el WriteResult, este indica el resultado de la operación. nMatched significa que la query del update coincidió con un documento y un documento fue modificado.
La query del update fue por id, al insertar un documento en una collection si no se especifica la propiedad _id, mongodb crea un _id automáticamente. NO pueden existir documentos sin un _id, ya que todos los documentos son distintos.
Si consultamos el hotel por id, podemos ver el array de rooms.
Como se ve en el resultado, perdimos toda la data anterior del hotel, solo se ve el _id y las rooms. Esto sucede porque por default el update sobreescribe el objeto de la query. Para agregar propiedades a un objeto existente se utiliza el operador $set
db.hotels.update({"_id" : ObjectId("56a62abbf1ec5d6ee655f88a")},{$set: {rooms:
[{ name: "Habitación Estandar", max:2, amenities:['Aire Acondicionado','TV',
'WIFI'] , category:"Standard" }
] }})
Como se ve en el update, se agrega el $set envolviendo un objeto con la propiedad a agregar.
Cuando consulto por el hotel, aparecen todas las propiedades que tenía más la nueva propiedad room.
Para agregar rooms al array puedo utilizar el operador $push y para remover el último elemento insertado puedo utilizar $pop.
Por ejemplo, agreguemos una nueva habitación.
<code>db.hotels.update({"_id" : ObjectId("56a62abbf1ec5d6ee655f88a")},{$push: {rooms: [ { name:
"Habitación Triple Standard", max:3, amenities:['Aire Acondicionado','TV','WIFI'] , category:"Standard" }] }})
</code>
Como se ve en la imágen, hay un error en el array rooms. El primer elemento es un objeto y el segundo es un array. Para solucionar esto puedo ejecutar el update con $pop y borrar el último elemento.
Un detalle a tener en cuenta con la operación update es que por default no actualiza todos los elementos que coinciden con la query. Supongamos que quiero agregarle a todos los documentos de la collection hotels una propiedad type para indicar que es un hotel y no un hostel o una cabaña.
En un principio sería el siguiente comando:
<code>db.hotels.update({}, {$set:{type:”HOTEL”}})</code>
El comando está bien pensado, la query es sobre todos los objetos y la operación es agregar una propiedad ($set) que setee type: HOTEL. Lo que va a suceder es que mongodb va a actualizar el primer objeto que coincida con la query. Para que actualice todos es necesario agregar la option {multi:true}
<code>db.hotels.update({}, {$set:{type:”HOTEL”}}, {multi:true})</code>
____________________________________________________________________________________________________________________________
________________________________________________________________________________________
D. DELETE
Para borrar documentos se utiliza la operación remove. La estructura es la siguiente:
<code>db.collection.remove({query})</code>
Antes de ejecutar un remove, les recomiendo que hagan un find de lo que van a borrar para chequear que es exactamente lo que quieren borrar.
Si quieren borrar todos los objetos de una collection pero no quiere borrar esta última pueden hacer lo siguiente:
<code>db.collection.remove({})</code>
Si quieren borrar los hoteles que cumplan cierta condición, se utilizan los mismos operadores que la operación find. Se puede borrar con condiciones y por _id.
5. Mongodb + Node.js
Para poder utilizar mongodb desde Node.js es necesario contar con un Driver. Este driver nos permite ejecutar las mismas operaciones que en la terminal. En mi caso utilizaré mongojs
Como las consultas en mongodb están hechas en Javascript, las puedo transladar como están a un programa en node.js. El único cambio que hay que hacer es agregarle un callback.
Veamos un ejemplo.
var mongojs = require("mongojs");
var db = mongojs("mongodb://localhost:27017/travel",["hotels"]);
db.hotels.find({},function(err,docs){
if(err){
console.log("Ocurrió un error al ejecutar la consulta",err);
}else{
console.log(docs);
}
});
Así como hicimos un find, podemos hacer cualquier otra operación como las que vimos anteriormente.
Mongodb es una base de datos que permite almacenar documentos, es schemaless y posee operaciones y operadores que se ejecutan con JavaScript que permiten interactuar con la data.
Las operaciones son insert, find, update y remove pueden contener operadores como $set, $unset, $push, $pop y hay que tener en cuenta que el update no actualiza todo por default. Es muy fácil realizar consultas con mongodb porque en un principio, solo tiene que coincidir el objeto query con las propiedaes que quiero filtrar.
Luego pasar esto a una aplicación javascript con nodejs es casi copiar y pegar la consulta. Con lo que vimos podemos crear un programa con nodejs, conectarse a una base de mongo y hacer las mismas operaciones.
¿Qué les pareció este tutorial? Queremos ver en qué proyectos utilizan Mongodb :) Y si quieres saber más sobre lenguajes de programación aquí podrás conseguir mayor información sobre nuestras cursos presenciales.
0 comentarios:
Publicar un comentario