¡Acceso ilimitado 24/7 a todos nuestros libros y vídeos! Descubra la Biblioteca Online ENI. Pulse aquí
¡Acceso ilimitado 24/7 a todos nuestros libros y vídeos! Descubra la Biblioteca Online ENI. Pulse aquí
  1. Libros
  2. Angular y Node.js
  3. El SGBD NoSQL MongoDB
Extrait - Angular y Node.js Optimice el desarrollo de sus aplicaciones web con una arquitectura MEAN
Extractos del libro
Angular y Node.js Optimice el desarrollo de sus aplicaciones web con una arquitectura MEAN
2 opiniones
Volver a la página de compra del libro

El SGBD NoSQL MongoDB

Introducción

MongoDB es un sistema de gestión básico de datos, creado en 2007 por la empresa con el mismo nombre (y en el momento en que se escribe este libro, en versión 4.0). Este SGBD forma parte de la familia NoSQL (Not only SQL), que agrupa a los SGBD no relacionales de diferentes tipos. La principal motivación para separarse del modelo relacional, es la voluntad de deshacerse de las numerosas restricciones que impone, restricciones que pueden ser muy molestas cuando se prioriza el accesos muy rápido a grandes volúmenes de datos. En parte, esta eficacia se debe a que las restricciones de integridad y las transacciones ACID no están garantizadas en MongoDB (también se debe a una creación con buen rendimiento y dinámica de los índices).

MongoDB almacena los datos en un formato binario llamado BSON (Binary JSon), que permite (con algunas excepciones) serializar los objetos JavaScript en binario (siguiendo un formato llamado clave/valor, los objetos JavaScript se implementan con tablas asociativas). La palabra BSON se inspira directamente en JSON, que es el formato textual de la serialización de los objetos JavaScript.

Entre la familia de los SGBD NoSQL, MongoDB se clasifica en la subfamilia de los SGBD orientados a documentos (principalmente con el SGBD Redis). Por lo tanto, esquemáticamente un documento es la representación de un objeto JavaScript...

¿Por qué utilizar una base de datos NoSQL?

MongoDB tiene como principal ventaja la capacidad de poder gestionar un volumen muy importante de datos, ya que una base de datos se puede repartir en varios servidores, garantizando los accesos eficaces (el SGBD Redis, conserva los datos en memoria RAM, garantiza los accesos todavía más eficaces, pero a costa de una cierta vulnerabilidad). Dicho esto, este beneficio no es forzosamente el que nos interesa, principalmente en el caso de El hilo rojo (la creación de una aplicación de comercio en línea), incluso si una empresa de e-commerce puede al final gestionar muchos datos, entre decenas de miles de referencias de los productos en venta y la base de datos de clientes.

Por otro lado, MongoDB es una buena opción para la gestión de datos heterogéneos y cuando es difícil predeterminar los atributos de las entidades en el origen de las tablas o las colecciones (por ejemplo, si quiere modelizar el contenido de los artículos de una enciclopedia en línea, sería muy difícil hacer una lista previa de todos sus atributos y si esta lista se pudiera hacer, es cierto que la mayoría de estos atributos no tendrá valores para numerosos artículos).

Para volver al estudio de casos, la principal motivación es quizás la homogeneidad de esta opción en el marco de un desarrollo guiado por JavaScript...

Presentación de MongoDB

1. Las colecciones y los documentos

Si está acostumbrado a un SGBD relacional, una primera aproximación (muy acertada) es considerar que las tablas se van a corresponder con las colecciones, y las tuplas con los documentos. Dicho esto (mal), es necesario ser consciente de lo siguiente:

  • En MongoDB, una base de datos no se supone que se construye siguiendo un esquema predefinido (incluso si es posible hacerlo por ejemplo con ODM Mongoose) y por lo tanto, las tuplas no se supone que tengan una lista idéntica de atributos.

  • Por otro lado, MongoDB no garantiza la verificación de las restricciones de integridad, esto debe  llevarse a cabo de la lógica empresarial.

Un punto importante que hay que entender bien, es que MongoDB solo permite una gestión parcial de las claves extranjeras. Si quiere identificar un documento (que llamaremos el documento destino) de una colección, en un documento (que llamaremos el documento origen) de otra colección, tiene dos soluciones:

  • La duplicación de las propiedades del documento destino en el documento origen, lo que puede parecer incómodo, pero facilitará el tiempo de acceso.

  • La identificación del documento destino en el documento origen, por el identificador único asignado por MongoDB (de hecho, como si manipulara una clave extranjera), pero esto le obligará a producir algo de código.

Este punto...

Implementación de MongoDB

1. Instalación de MongoDB

a. Instalación de MongoDB en Linux

Toda la información útil está en el sitio web: https://docs.mongodb.com/manual/installation/

Y en particular para Ubuntu, consulte: https://docs.mongodb.com/manual/tutorial/install-mongodb-on-ubuntu/

El lanzamiento del servicio se realiza con el siguiente comando (atención, Systemd es el administrador de servicios desde Ubuntu 16.04):

sudo systemctl enable mongodb 

Para verificar cuál es el puerto ocupado por MongoDB (funciona por defecto en el puerto 27017):

sudo netstat -antup 

b. Instalación de MongoDB en Windows o en Mac OS

Toda la información útil está en el sitio web: https://docs.mongodb.com/manual/installation/

c. Utilización de MongoDB en línea de comandos

En línea de comandos, la gestión de las bases de datos de MongoDB y de las colecciones contenidas en ella, se realiza gracias al mongo shell, que es una interfaz JavaScript interactiva. Para esto, es suficiente con lanzar el ejecutable mongo en su terminal o su línea de comandos:

mongo 

El mongo shell puede evaluar (casi) cualquier código JavaScript y mostrar los resultados a través de su método print():

var me="Pierre"  
print("Hola", me) 

La función print() permite mostrar mensajes en el terminal o la línea de comandos. 

En los ejemplos que siguen, las palabras rodeadas por < y > se sustituyen por sus propios datos:

  • <nombreDeLaBase>: nombre de su base MongoDB.

  • <nombreDeLaColeccion>: nombre de su colección MongoDB.

  • <Documento>: un documento MongoDB, es decir, un objeto almacenado en una colección.

  • <Colleccion>: una colección, es decir una lista de objetos: [Objeto1, ..., Objeton]

  • <ObjetoFiltro>: un objeto que permite filtrar una colección MongoDB para seleccionar los documentos. Se corresponde con los criterios de búsqueda. 

  • <ArchivoJSON>: un archivo en el formato JSON.

2. Visualización de la lista de las bases de datos

La lista de las bases de datos se obtiene con la siguiente instrucción:

show dbs 

3. Creación de una base de datos

La creación de una base de datos se obtiene con la siguiente instrucción:

use <nombre de la base de datos> 

Pero atención, esta creación solo será efectiva...

Utilización de MongoDB a través de Node.js

Para ilustrar la asociación entre Node.js y MongoDB, va a crear diferentes versiones de un servidor Node.js, llamado onlinesalesserver.

Este servidor será configurado por el archivo package.json.

1. Instalación del módulo MongoDB para Node.js

 Primera etapa: cree el esqueleto del archivo package.json, con el comando npm init.

Respecto a las peticiones de información que provoca este comando, solo se guarda el nombre del servidor, su descripción, el archivo que lo contiene y su nombre.

A continuación se muestra el archivo package.json, así como el producto:

{  
  "name": "onlinesalesserver",  
  "versión": "1.0.0",  
  "description": "servidor de venta de productos high tech",  
  "main": "onlinesalesserver.js",  
  "scripts": {  
    "test": "echo \"Error: no test specified\" && exit 1"  
  },  
  "author": "Pierre Pompidor",  
  "license": "ISC"  
} 

 Como ha instalado Node.js globalmente, pregunte su versión con node -v, y complete este archivo con la propiedad engines. Complete también el objeto scripts con la propiedad start, lo que permite utilizar npm para lanzar el servidor:

{  
  ...  
  "scripts": {  
    "test": "echo \"Error: no test specified\" && exit 1",  
    "start": "node onlinesalesserver.js"  
  },  
  ...  
  "engines": { "node": ">= 8.10.0" }  
} 

 Segunda etapa: instale los módulos express, cors y mongodb:

npm install express cors mongodb --save 

La opción --save permite completar las dependencias listadas en el archivo package.json.

A continuación se muestra la versión (por el momento) final, de este archivo.

{  
  "name": "onlinesalesserver",  
  "versión": "1.0.0",  
  "description":...

Interrogación de MongoDB con las rutas gestionadas por express

Ahora va a preguntar a su base de datos MongoDB, invocando al servidor Node.js con consultas http, que expresan rutas. Estas rutas se gestionan por el módulo express de Node.js.

1. La estructura de un servidor Node.js que consulta a MongoDB

Un servidor Node.js que consulta a MongoDB, implica las siguientes acciones:

  • Utilización del módulo express:

  • para crear una aplicación que gestione las rutas;

  • y que escuche en un puerto dado.

  • Utilización del módulo cors para permitir el cross-origin resource sharing.

  • Creación del cliente MongoDB que:

  • se conecta a una base de datos gestionada por el servidor MongoDB;

  • establece los «listeners» sobre las diferentes rutas.

En el ejemplo estructural siguiente, <route> hace referencia a una ruta cualquiera.

"use strict";  
var express=require("express");  // Utilización del módulo express  
var app=express();               // para crear una aplicación express  
app.listan(8888);                // que escucha en un puerto dado 
var cors=require("cors");        // Utilización del módulo cors  
  
app.use(cors());      // para permitir el cross-origin resource sharing  
  
var MongoClient = require("mongodb").MongoClient;  
var url = "mongodb://localhost:27017";  
var assert = require("assert");  
  
MongoClient.connect(url, {useNewUrlParser: true}, (err, cliente) => {   
    let db = cliente.db("OnlineSales");  
    assert.equal(null, err);   
    app.get(<route>,   
           (req, res) => { // gestión de una ruta (método GET)   
                            ...   
    });   
  
    ... // otras gestiones de rutas a través del método GET   
  
    app.post(<route>,   
            (req, res) => {...

El hilo rojo del lado servidor

A continuación se muestra el momento de crear algunos productos para vender. 

1. Creación de la colección

El objetivo es crear una colección de prueba llamada Products, a partir del archivo Products.json siguiente:

   [{  
  "type":"phone", "brand":"Peach", "name":"topPhone 8 32G",  
  "popularity":4, "price":900,  
  "picture":"topphone8.jpeg", "stock":5  
 },  
 {  
  "type":"phone", "brand":"Peach", "name":"topPhone 8 64G",  
  "popularity":5, "price":1000,  
  "picture":"topphone8.jpeg", "stock":20  
 },  
 {  
  "type":"phone", "brand":"Peach", "name":"topPhone 8 256G",  
  "popularity":4, "price":1300,  
  "picture":"topphone8.jpeg", "stock":18  
 },  
 {  
  "type":"phone", "brand":"Threestars", "name":"bigPhone 9",  
  "popularity":4, "price":700,  
  "picture":"bigphone9.jpeg", "stock":10  
},  
{  
  "type": "phone", "brand": "Konia", "name": "Konia4000",  
  "picture": "konia4000.jpeg", "stock":0  
},  
{  
  "type":"computer", "brand":"Vale", "name":"Vale 3000",  
  "popularity":4, "price":700,  
  "picture":"vale3000.jpeg", "stock":32  
},  
{  
  "type":"computer", "brand":"Peach", "name":"Peach pro",  
  "popularity":5, "price":1300,  
  "picture":"peachpro.jpeg"...

Conocimientos adquiridos en este capítulo

Utilizar un sistema de gestión básico de datos NoSQL orientado a documento, y más particularmente MongoDB, aporta dos grandes beneficios. El primero es poder gestionar grandes volúmenes de datos de manera eficaz (gracias, entre otras, a la creación de índices, pero la verificación de las restricciones de integridad y el respeto a las propiedades ACID de las transacciones no están garantizado), el segundo es poder almacenar documentos heterogéneos, es decir, que no presentan necesariamente entre ellos las mismas propiedades (los documentos son los objetos serializados JavaScript en un formato binario en las colecciones).

Esta solución también es muy apreciada en el caso de una arquitectura MEAN, que implementa un servidor Node.js y una aplicación Angular, ya que garantiza la homogeneidad de la representación de datos (objetos JavaScript) y de su manipulación.

Hemos explicado cómo instalar MongoDB, insertar documentos en una colección y crear nuevas colecciones. La consulta de las colecciones se ha estudiado con cuidado: el método find() especifica un objeto encargado de filtrar la colección destino (un determinado número de operadores de comparación, de conjunto y lógicos que se han revisado en esta ocasión), y permite a través de un segundo argumento...