Primeros pasos en MongoDB

Introducción a MongoDB y tareas básicas de gestión de datos (consultas, modificaciones, inserciones y eliminaciones)
4.0 (50 ratings) Instead of using a simple lifetime average, Udemy calculates a
course's star rating by considering a number of different factors
such as the number of ratings, the age of ratings, and the
likelihood of fraudulent ratings.
375 students enrolled
$30
Take This Course
  • Lectures 65
  • Contents Video: 7 hours
  • Skill Level All Levels
  • Languages Spanish
  • Includes Lifetime access
    30 day money back guarantee!
    Available on iOS and Android
    Certificate of Completion
Wishlisted Wishlist

How taking a course works

Discover

Find online courses made by experts from around the world.

Learn

Take your courses with you and learn anywhere, anytime.

Master

Learn and practice real-world skills and achieve your goals.

About This Course

Published 5/2014 Spanish

Course Description

El curso, que es el primero de una serie de cursos sobre MongoDB, nos permite realizar una primera toma de contacto con MongoDB, base de datos orientada al documento. Vamos a ver:

  • qué es MongoDB y qué tiene que ver con NoSQL o Big Data
  • qué le diferencia de otras bases de datos
  • cómo lo instalamos en un equipo
  • cómo podemos trabajar con la información que almacenamos en él

Al finalizar el curso serás capaz de recuperar información almacenada en MongoDB, utilizando todo tipo de condiciones. Además, aprenderás a manipular dicha información, modificando o eliminando la que ya existe, o introduciendo nueva.

El curso consta de una serie de lecciones en formato vídeo, que constan tanto de contenidos teóricos cómo prácticos. La longitud de los vídeos suele ser inferior a los diez minutos, aunque en ocasiones alguno de ellos se acerca a los quince minutos.

Veremos cómo replicar en vuestros equipos los ejemplos incluidos en los vídeos, para que hagáis con vuestras propias manos las operaciones que os muestro. Para ello veremos cómo realizar una instalación de MongoDB.

Cada cierto número de lecciones se incluye un grupo de preguntas para comprobar el grado de compresión de los temas tratados. En ocasiones, se incluye algún ejercicio práctico entre las preguntas, que requiere la descarga de algún archivo y el manejo de un servidor MongoDB. También se incluyen diversos ejemplos de código NodeJS, para ver cómo se trabaja con MongoDB desde una aplicación.

El curso puede ser completado en unas tres semanas, una para cada una de las secciones principales, dedicando unas 8 - 12 horas a la semana. En todo caso, elige el ritmo que más se adapte a tu disponibilidad.

What are the requirements?

  • Para realizar los ejemplos del curso hay que instalar MongoDB
  • Conocimientos básicos de Javascript y NodeJS

What am I going to get from this course?

  • Instalación y configuración básica de MongoDB
  • Guardar y modificar información en MongoDB
  • Consultar información guardada en MongoDB

What is the target audience?

  • Administradores de bases de datos
  • Programadores web
  • Aficionados a la informática
  • Emprendedores

What you get with this course?

Not for you? No problem.
30 day money back guarantee.

Forever yours.
Lifetime access.

Learn on the go.
Desktop, iOS and Android.

Get rewarded.
Certificate of completion.

Curriculum

Section 1: Introducción al curso
Introducción
01:54
Section 2: Introducción a MongoDB
06:59
MongoDB almacena la información en documentos.
El formato de documento que utiliza es JSON. Veremos un ejemplo.
La gran mayoría de lenguajes de programación cuentan con estructuras de datos afines a JSON, lo que facilita la creación de aplicaciones con MongoDB.
Los documentos se almacenan en MongoDB agrupados en colecciones.
Las colecciones no imponen ninguna estructura a los documentos que la integran.
03:31
MongoDB ofrece alto rendimiento.
Se pueden crear índices sobre todo tipo de campos.
Los índices son una de las piezas fundamentales a la hora de mejorar el rendimiento de una base de datos.
MongoDB permite utilizar el escalado horizontal para hacer frente a las demandas crecientes de recursos de nuestras aplicaciones.
03:48
MongoDB proporciona alta disponibilidad mediante la replicación.
En la replicación, un equipo recibe todas las operaciones de escritura, mientras que el resto las van replicando de manera asíncrona.
La replicación proporciona tolerancia a fallos y recuperación de nodos, ambas de manera automática en buena parte de los posibles escenarios de error.
Características de MongoDB
4 questions
03:49
Hoy en día hay gran cantidad de aplicaciones o servicios en Internet que generan una ingente cantidad de datos, bien de manera automática (logs, servicios en la nube,...) o bien por la interacción con los usuarios (twitter, facebook,...)
Nos encontramos ante un fenómeno nuevo, denominado Big Data, en el que la información que se genera es muy grande (Volume), se hace de manera rápida y constante (Velocity), y en ocasiones de forma no estructurada y cambiante (Variety).
Durante muchos años los servicios y aplicaciones de Internet se han apoyado en las bases de datos relacionales. Pero pronto se observó que éstas tenían ciertas carencias a la hora de enfrentarse a aplicaciones Big Data.
Surgen entonces nuevas bases de datos pensadas desde el inicio para trabajar con grandes fuentes de información (Big Data) no estructuradas y/o cambiantes (dynamic schema), y para escalar horizontalmente (añadir equipos) en vez de verticalmente (añadir recursos a las máquinas existentes).
Pronto a alguien se le ocurrió acuñar un término para agruparlas: NoSQL. Lo que pasa es que ese término es confuso, ya que da a entender que la principal característica de estas nuevas bases de datos es que no tienen un lenguaje SQL.
04:18
Vamos a clasificar las bases de datos utilizando una gráfica. En ella mediremos en horizontal la funcionalidad de la base de datos, y en vertical la capacidad para mantener el rendimiento cuando se escala.
Las bases de datos relacionales están muy a la derecha de la gráfica (gran funcionalidad), pero muy bajo (poca capacidad de mantener el rendimiento cuando hay que escalar).
Algunas bases de datos NoSQL están muy a la izquierda de la gráfica (poca funcionalidad), pero muy alto (gran capacidad de mantener el rendimiento cuando hay que escalar).
MongoDB se creo con la idea de mantener la mayor parte de la funcionalidad de las bases de datos relacionales, desechando sólo aquélla que penalizaba mucho la capacidad de mantener el rendimiento cuando hay que escalar.
Las transacciones y los joins son las principales características de las bases de datos relacionales que MongoDB no incluye.
06:32
Se puede utilizar el teorema (CAP) para clasificar las bases de datos NoSQL. El teorema afirma que en los sistemas distribuidos es imposible conseguir simultáneamente consistencia (Consistency), disponibilidad (Availability) y tolerancia a la partición (Partition).
La disponibilidad se refiere al hecho de que toda petición al sistema recibirá una respuesta de éxito o error.
La consistencia se refiere al hecho de que todas las peticiones realizadas en el mismo momento ven los mismo datos.
Mientras que la tolerancia a particiones se refiere al hecho de que el sistema es capaz de seguir funcionando incluso en el caso de errores en las comunicaciones o de que una parte de él falle.
MongoDB generalmente se incluye entre los que escogen consistencia y tolerancia a la partición (CP). Pero veremos que según cómo configuremos nuestro sistema es posible pensar que MongoDB se acerca más a los que escogen disponibilidad y tolerancia a fallos (AP).
Situemos a MongoDB
4 questions
02:53
En una aplicación MongoDB tendremos primero unos clientes que solicitan la ejecución de determinadas tareas: añadir usuarios, mostrar comentarios,...
Sus solicitudes son atendidas por un servidor de aplicaciones que las convierte en operaciones que se ejecutan en MongoDB.
Supongamos que se trata de una aplicación NodeJS. Para comunicarse con MongoDB utiliza su driver, el de NodeJS. Existen drivers para otros entornos (Java, PHP, .NET, C++, Python,...).
Las operaciones llevadas a cabo por MongoDB producen unos resultados que la aplicación NodeJS devolverá al cliente adecuado.
Paralelamente a esto puede darse la circunstancia de que los administradores de los servidores de MongoDB necesiten llevar a cabo alguna tarea, para lo que generalmente utilizarán el shell de MongoDB para conectarse a aquéllos.
Anatomía de una aplicación MongoDB
1 question
03:44
Si instalamos MongoDB en distribuciones Linux mediante un gestor de paquetes se creará un usuario mongod que será el utilizado para ejecutar MongoDB.
Además se incluirán scripts de control, principalmente el de inicio /etc/rc.d/init.d/mongodb.
La configuración utilizada estará en /etc/mongodb.conf. Los directorios de trabajo serán /var/lib/mongo para guardar los datos y /var/log/mongo para guardar los logs.
Otra opción es descargar MongoDB e instalarlo manualmente. En este caso tendremos que encargarnos de crear un usuario para ejecutar MongoDB, los scripts de control, los directorios de trabajo (con sus correspondientes permisos).
Además deberemos incluir la carpeta en la que está MongoDB en el PATH de nuestro equipo.
03:36
En http://www.mongodb.org/downloads tenemos diversas opciones para descargar MongoDB, por sistema operativo, arquitectura y versión.
Sí el segundo dígito de la versión es impar se trata de una versión de desarrollo. Las estables son las que tienen ese dígito par.
En producción siempre es recomendable escoger la versión estable de 64 bits de nuestro sistema operativo. Las de 32 bits están bien para desarrollo, pero limitan a 2GB la información almacenada por MongoDB, ya que el motor de almacenamiento utiliza ficheros mapeados de memoria o memory-mapped files.
Dentro de la carpeta que se creará al instalar MongoDB existe un directorio denominado bin, que es el que contendrá todos los ejecutables.
04:04
mongod es el que ejecuta el servidor de MongoDB. Por defecto utiliza /data/db/ como directorio del almacenamiento de datos, y el puerto 27017 para escuchar peticiones de los clientes.
Si tecleamos mongod --help se nos mostrarán todas las opciones. Quizás la más interesante es -f ó --config fichero de configuración. En este fichero podemos incluir el resto de opciones.
Si queréis consultar todas las opciones disponibles en la web de MongoDB, aquí tenéis el enlace: http://docs.mongodb.org/manual/reference/configuration-options/
Para arrancar un servidor MongoDB en el puerto 37017 y que guarde los datos en el directorio db hacemos mongod --port 37017 --dbpath ./db. Hay que crear el directorio antes de ejecutar lo anterior, y asegurarse de que mongod tiene permisos de lectura y escritura sobre él.
03:37
Una vez funcionando MongoDB podemos conectarnos a él simplemente tecleando mongo en nuestra terminal.
Por defecto mongo trata de conectarse al puerto 27017 de localhost en la base de datos test. Si tecleamos mongo --help se nos mostrarán todas las opciones.
Podemos pensar en mongo como en una especie de consola administrativa de nuestro servidor MongoDB.
Instalación
5 questions
03:58
JSON (JavaScript Object Notation) es un formato estándar utilizado principalmente para transmitir datos entre un servidor web y una aplicación web.
Inicialmente extraído de JavaScript, actualmente es independiente del lenguaje de programación. Es de fácil lectura por parte de personas, y consta de pares nombre-valor. En http://json.org/json-es.html tenemos la especificación de JSON.
El nombre es siempre una cadena o string, que identifica a cada uno de los pares. Los valores pueden ser de seis tipos: String o cadena, Number o número, Boolean o booleano (true o false), null, Array, Objeto o documento, es decir un objeto JSON puede contener otro documento JSON, sin límite de recursividad.
En cada par nombre-valor, el nombre debe ir rodeado de comillas dobles, aunque la gran mayoría de lenguajes de programación admiten su no utilización, salvo que el nombre incluya espacios, puntos,... o empiece por algo que no sea una letra.
Si bien el estándar no prohíbe explícitamente repetir el nombre para dos pares nombre-valor de un mismo documento JSON, debe evitarse siempre, puesto que en la práctica generalmente el segundo par oculta al primero.
04:25
En MongoDB la información internamente no se almacena utilizando JSON, sino BSON. BSON es JSON codificado de manera binaria.
Esto puede provocar en la mayoría de los casos una menor cantidad de espacio de almacenamiento, pero no es la principal ventaja de BSON.
BSON es mucho más veloz, puesto que acelera el escaneo, es decir podemos acceder más rápido a los distintos campos de un documento.
En BSON no es necesario recorrer todos los campos de un documento de manera secuencial hasta llegar al que nos interesa, sino que podemos saltar campos sin necesidad de comprobar su contenido.
BSON almacena información sobre las longitudes de los campos de cada documento para facilitar estos saltos.
04:52
BSON proporciona tipos de datos que no existen en JSON, como Date para fechas, BinData para información binaria, ObjectId para valores únicos (generalmente usado para el campo _id de las colecciones),...
En http://bsonspec.org/#/specification se explica el formato. Veamos algunos de los tipos de datos BSON.
ObjectId es pequeño, casi único, rápido de crear y ordenado. Consta de 12 bytes: cuatro para guardar los segundos desde el 1 de enero de 1970, tres para identificar la máquina, dos para identificar el proceso, y tres para un contador.
String se utiliza para almacenar cadenas de texto, y usa UTF-8.
Timestamp consta de 64 bits. 32 para los segundos desde el 1 de enero de 1970 y 32 para un ordinal que distingue operaciones dentro de un mismo segundo.
Date consta de 64 bits, que representan los milisegundos desde el 1 de enero de 1970. Los números negativos son fechas anteriores.
04:56
Cuando una aplicación realiza una consulta a un servidor de MongoDB, lo que se envía realmente son documentos en formato BSON.
El driver de nuestra aplicación se encargará de leer esta información de la memoria física, y de transformarla en algo que nuestra aplicación pueda manejar.
En qué lo transforme, dependerá del lenguaje que estemos utilizando. En Java será un objeto Java de una clase determinada, por ejemplo.
En MongoDB, un documento BSON no puede ser superior a 16 MB. Para documentos mayores tenemos GridFS, que los trocea.
Además el nombre de un campo no puede ser _id (reservado), empezar por el signo del dólar ($) o contener un punto (.). El orden de los campos en un documento BSON no se mantiene en MongoDB (a partir de la versión 2.6 sí).
JSON y BSON
5 questions
10:32
El shell de MongoDB ejecuta JavaScript. A partir de la versión 2.4 de MongoDB se sustituyó el motor por defecto de JavaScript. Se pasó de SpiderMonkey a V8.
Con un conocimiento básico de JavaScript podremos hacer las tareas administrativas desde el shell de MongoDB.
Necesitaremos conocer cómo se escriben literales de números, cadenas, arrays y objetos en JavaScript. Y cómo se accede a los elementos de un array o de un objeto, así como la forma de declarar una variable y de asignarle valores.
No debería ser necesario conocer la forma de crear funciones, pero pudiera ser de utilidad en algún caso. Para imprimir en pantalla utilizaremos print() y printjson(), este último para objetos.
06:07
Cuando iniciamos el shell de MongoDB, contamos con una variable, db, que apunta a la base de datos activa. Para trabajar con otra base de datos tendremos que teclear use nombre_otra_bd.
Para ver los comandos que podemos utilizar en el shell usaremos help. Para ver los comandos que podemos utilizar sobre una base de datos tenemos db.help(). Para ver los comandos que podemos utilizar sobre una colección db.nombre_coleccion.help().
Si queremos abandonar el shell podemos utilizar exit o Control+C. Para ver las bases de datos que tenemos utilizaremos show dbs. Para ver las colecciones que tenemos en la base de datos actual utilizaremos show collections.
Para contar los documentos de una colección tenemos db.nombre_colecccion.count(). Para obtener sólo un documento ejecutaremos db.nombre_colecccion.findOne().
04:16
Podemos insertar documentos en una colección con db.nombre_coleccion.insert( documento ). Si la colección no existiera se crearía antes de insertar nada, por lo que no hay necesidad de crear implícitamente colecciones.
Se puede llenar una colección para hacer pruebas con algo así como for (var i = 1; i <= 250; i++) db.testData.insert( { x : i } ).
Si no utilizamos el campo _id al insertar un documento, MongoDB lo incluirá con un valor de tipo ObjectId. El campo _id siempre ha de existir en una colección, así que o lo proporcionamos nosotros o lo hace MongoDB. Ha de ser único y se genera automáticamente un índice sobre él. El valor del campo _id es inmutable.
05:41
Podemos cargar un fichero js en el shell con load("nombre_fichero.js"). Para saber cuál es el directorio actual podemos hacer pwd(), y para cambiar a otro directorio podemos hacer cd( ruta ), donde ruta es la ruta local del directorio al que queremos cambiar.
Otra opción es arrancar el shell y a la vez cargar un fichero js con mongo localhost:puerto/nombre_bd --shell nombre_fichero.js.
Algunos comandos utilizados en el shell cambian si se quieren utilizar desde un fichero js, como por ejemplo: show dbs es db.adminCommand('listDatabases'), use nombre_bd es db = db.getSiblingDB('<db>') y show collections es db.getCollectionNames().
Consola de MongoDB
5 questions
05:15
Mongoimport es una herramienta que nos permite cargar datos en MongoDB a partir de un fichero con datos en formato CSV, TSV o JSON. Para ver las opciones de las que disponemos podemos utilizar mongoimport --help en nuestra consola.
El uso más básico de esta herramienta se haría con mongoimport -d nombre_bd -c nombre_colecccion < ruta_y_nombre_fichero.
Con esto se supondría que el servidor MongoDB está funcionado en el puerto 27017 en localhost, e importaría el contenido del fichero especificado en la base de datos y colección indicados. Si éstas no existen se crearían y no darían error de no existencia.
Si MongoDB no está funcionado en el puerto 27017 de localhost, podemos utilizar la opción --host nombre_equipo:puerto ó --host nombre_equipo --port puerto.
Tras importar los datos podemos ejecutar el shell de MongoDB con mongo para comprobar que todo ha ido bien.
Importación de datos
1 question
03:35
Durante el curso se proporcionarán ejemplos utilizando NodeJS, por lo que es conveniente instalarlo en nuestro ordenador si aún no lo tenemos.
Para instalar NodeJS vamos a http://www.nodejs.org/ y escojemos la opción adecuada para nuestro sistema operativo, arquitectura y versión. Tras instalarlo podemos asegurarnos de que el directorio en el que se instaló está incluido en el PATH.
NPM es el gestor de paquetes de NodeJS. Nos ayuda a gestionar las dependencias de una aplicación. Si una aplicación depende de un módulo podemos instalarlo ejecutando npm install nombre_modulo en el directorio de la aplicación.
Esto instalará el módulo sólo para esta aplicación. Si quisiéramos instalarlo para todas las aplicaciones NodeJS de la máquina haríamos npm install nombre_modulo -g.
O podemos crear un archivo denominado package.json en el que incluiremos todas las dependencias de la aplicación, así como otra información relativa a la aplicación.
En este caso ejecutando npm install en el directorio de la aplicación instalará todos los módulos incluidos en package.json. Una manera de incluir un módulo en las dependencias es ejecutando npm install nombre_modulo --save.
05:00
Nuestro primer ejemplo será tan sencillo como conectar a la instancia MongoDB de nuestra máquina y ejecutar un findOne. Vamos a ver qué métodos tenemos que utilizar, qué parámetros son necesarios,...
Tenéis el código en el archivo 2.PrimerEjemploNodeJSMongoDB.zip
NodeJS
1 question
Section 3: Operaciones de lectura
01:42
Vamos a centrarnos ahora en las operaciones de lectura que se pueden realizar en MongoDB. Previamente veremos de forma rápida cómo se insertan documentos en una colección, para no tener que trabajar con colecciones vacías.
Luego veremos cómo recuperar documentos de las colecciones de nuestras bases de datos, y cómo establecer condiciones que tienen que cumplir los documentos recuperados.
También veremos las posibilidades que tenemos para recuperar sólo algunos de los campos de los documentos.
03:43
Las operaciones de manipulación de datos que se pueden llevar a cabo en una base de datos son cuatro: crear, leer, actualizar y eliminar. CRUD es un acrónimo que se refiere a estas operaciones. Viene de Create, Read, Update y Delete.
En MongoDB no existe un lenguaje SQL de manipulación de datos para realizar estas cuatro operaciones, sino que se utilizan métodos o funciones de la API de un driver.
En el caso del shell las funciones que hay que utilizar para llevar a cabo las operaciones CRUD son métodos de la colección sobre las queremos actuar. Por ejemplo, para leer los documentos de una colección de comentarios haríamos db.comentarios.find().
04:10
En MongoDB no existe un lenguaje SQL de manipulación de datos para realizar estas cuatro operaciones, sino que se utilizan métodos o funciones de la API de un driver.
El driver se encarga de convertir estas llamadas a funciones en mensajes que se envían al servidor de MongoDB utilizando lo que se conoce como MongoDB Wire Protocol.
Cuando utilizamos el shell o el API de un driver, nosotros recurrimos a las funciones específicas de CRUD, pero lo que se transmite por la red a los servidores de MongoDB son mensajes con información necesaria para ejecutar la operación deseada.
CRUD
2 questions
06:47
Para introducir documentos en una colección desde el shell utilizaremos el método insert sobre dicha colección, ejecutando db.nombre_coleccion.insert( documento ). Si queremos introducir más de un documento tendremos que proporcionar una array de documentos, en vez de uno solo.
Si al insertar un documento, éste no tiene campo _id, MongoDB automáticamente creará uno con un ObjectId. Si nuestro documento tiene _id, pero su valor ya existe en la colección, la operación devolverá un error de clave duplicada, y no se insertará el documento.
Internamente toda colección cuenta con un índice único sobre el campo _id, de modo que sus valores no pueden repetirse. Podríamos decir que se comporta como una clave primaria del mundo relacional.
Existe otro método del shell que nos permite insertar documentos en una colección, db.nombre_coleccion.save( documento ), pero en este caso además también sirve para actualizar documentos. Si el documento proporcionado no tiene campo _id realiza una inserción. Si tiene campo _id realizará una inserción si el valor de _id no existe en la colección, o una actualización si el valor de _id ya existe en la colección.
03:30
Vamos a ver dos ejemplos de inserción de documentos utilizando NodeJS. En el primero insertamos un documento, mientras que en el segundo insertamos varios documentos. La sintaxis es la misma, lo que cambia es lo que le pasamos a la función que realiza la inserción en MongoDB.
El código de los ejemplos lo tenéis en 3.CrearDocumentos.NodeJS.zip
Crear documentos
2 questions
05:15
El método a utilizar en el shell para recuperar documentos es find, por lo que haremos db.nombre_coleccion.find(). Esto nos devuelve todos los documentos de la colección.
La sintaxis genérica del método es db.nombre_coleccion.find( criterio , proyección ). El criterio sirve para filtrar los documentos, mientras que la proyección sirve para obtener sólo algunos de los campos de cada documento. Tanto el criterio como la proyección son documentos JSON.
En general sólo se muestran los campos que se incluyen en la proyección con un 1 o true. Si no se incluyen no se muestran. Pero el campo _id es una excepción, y ha de especificarse que no se quiere mostrar con { _id : 0 } .
Existe otro método para recuperar documentos, o mejor dicho para recuperar un sólo documento, findOne. Después de aplicar el criterio especificado devuelve un único documento.
Si repetimos db.nombre_coleccion.findOne() varias veces puede que la respuesta cambie, sin que eso signifique que la colección haya sido modificada. Se utiliza a menudo para averiguar la estructura de los documentos de una colección.
03:58
Vamos a ver dos ejemplos de recuperación de documentos utilizando NodeJS. En el primero imponemos una condición y recuperamos sólo alguno de los campos de los documentos que la cumplen, mientras que en el segundo recuperamos toda la información de un documento que cumpla la condición impuesta. La sintaxis es casi la misma, lo que cambia es la función que enviamos a MongoDB.
El código de los ejemplos lo tenéis en 3.RecuperarDocumentos.NodeJS.zip
Recuperar documentos
2 questions
06:43
Profundicemos algo más en las posibilidades que tenemos para filtrar los documentos a recuperar. Los operadores que podemos usar dentro del criterio son muy variados (query operators u operadores de consulta). Tenemos todos los operadores en http://docs.mongodb.org/manual/reference/operator/query/#query-selectors.
Para los ejemplos del shell vamos a utilizar una colección de puntuaciones con un modelo de documento concreto. Si queréis utilizar la colección en vuestro entorno de trabajo podéis descargar el archivo 3.FiltrarDocumentos.zip y descomprimirlo.
Ejecutáis mongo localhost:vuestroPuerto --shell ruta/cargaPuntuaciones.js. Prestad atención a utilizar el puerto en el que escucha vuestra instancia de MongoDB y la ruta en la que habéis descomprimido el archivo anterior. Quizás tengáis que omitir --shell.
Si le echáis un vistazo veréis que cambia de base de datos, vacía la colección puntuaciones y luego la alimenta con 2000 documentos (puntuaciones aleatorias de 0 a 99.99).
05:07
Imaginemos que queremos obtener los exámenes que han tenido una puntuación de 90 ó más. Tendríamos db.puntuaciones.find( { puntuacion : { $gte : 90 } } ). Fíjaros que sólo aparecen 20 resultados, aunque probablemente haya más.
El servidor cuando recibe la consulta crea un cursor y el shell recupera del cursor los 20 primeros documentos. Si hubiese más, podríamos verlos de 20 en 20, tecleando it sucesivamente. Más adelante veremos esto más extensamente.
Observad que cuando los documentos empiezan a tener cierto tamaño no es fácil verlos bien en pantalla. Para solucionar esto podemos añadir .pretty() al final de nuestra instrucción find.
También podría sernos útil conocer el número de exámenes que han tenido una puntuación de 90 ó más. Esto lo haríamos con db.puntuaciones.find( { puntuacion : { $gte : 90 } } ).count().
Cabe destacar que estos comparadores de comparación pueden usarse con cadenas, aunque utilizan códigos UTF-8, lo que a veces no es muy útil. Y también con otros tipos de campos, como fechas.
En el archivo 3.OperadoresComparacion.zip tenéis el código del ejemplo NodeJS
11:35
Para combinar condiciones sobre campos distintos podemos hacer lo siguiente: db.puntuaciones.find( { tipo : { $ne : "examen" } , puntuacion : { $lt : 30 } } ). Esto nos devuelve los ejercicios que no son exámenes con una puntuación inferior a 30.
O para combinar condiciones sobre el mismo campo, db.puntuaciones.find( { tipo : "examen" , puntuacion : { $gt : 80 , $lt : 90 } } ).pretty() para obtener los exámenes con una puntuación entre 80 y 90.
A veces lo que queremos es que se cumpla alguna condición de entre varias. Para ello hay que utilizar el operador $or, e incluir las condiciones en un array.
También existe la posibilidad de utilizar el operador $and de manera análoga, pasando en un array todas las condiciones a cumplir. En general es más sencillo utilizar la sintaxis que ya hemos visto.
08:04
Otra posibilidad a la hora de filtrar los documentos es la comprobación de si un campo existe, operador $exists, o de qué tipo es, operador $type. Los tipos de BSON Type están en http://docs.mongodb.org/manual/reference/bson-types/. Las cadenas son de tipo 2, ObjectId de tipo 7, los arrays de tipo 4,...
Por último tenemos la posibilidad de utilizar expresiones regulares para filtrar en MongoDB. Utiliza PCRE para ello. Un ejemplo muy sencillo es db.nombre_coleccion.find( { campo : /^A/i } ) ó db.nombre_coleccion.find( { campo : { $regex: '^A', $options: 'i' } } ). http://www.php.net/manual/es/pcre.pattern.php y http://perldoc.perl.org/perlre.html
Filtrar documentos 1
3 questions
10:37
Cuando necesitamos filtrar documentos utilizando condiciones sobre campos de tipo array la cosa cambia un poco. Si utilizamos una condición de igualdad está se evaluará del siguiente modo: si uno de los valores del array es igual al valor de la condición, el documento es recuperado.
Vamos a trabajar con una colección de datos de un gimnasio. Si queréis utilizar la colección en vuestro entorno de trabajo podéis descargar el archivo 3.CondicionesArrays.zip y descomprimirlo.
Luego ejecutáis mongo localhost:vuestroPuerto --shell ruta/cargaPreferencias.js. Prestad atención a utilizar el puerto en el que escucha vuestra instancia de MongoDB y la ruta en la que habéis descomprimido el archivo anterior.
Existen otros operadores muy útiles para filtrar campos de tipo array. Por ejemplo, para averiguar cuántas personas han mostrado interés por el aquagym o por la natación podemos utilizar el operador $in.
Para averiguar cuántas personas han mostrado interés por el aquagym y por la natación usamos el operador $all. Para averiguar cuántas personas no han mostrado interés ni por el aquagym ni por la natación tenemos el operador $nin.
El último operador que vamos a ver es $size, que sirve para comprobar si el tamaño de un array es igual a un determinado valor.
02:43
Vemos un ejemplo sencillo de filtrado de documentos del gimnasio, utilizando NodeJS. El operador es $in, ya que queremos los clientes que han mostrado preferencia por el Aquagym o la Natación.
En el archivo 3.CondicionesArrays.NodeJS.zip tenéis el código del ejemplo.
Condiciones sobre arrays
3 questions
07:46
También es posible imponer condiciones sobre campos pertenecientes a subdocumentos de un documento. Vamos a trabajar con una colección de datos de puntuaciones con modelo de documento distinto al visto hasta ahora.
Si queréis utilizar la colección en vuestro entorno de trabajo podéis descargar el archivo 3.NotacionPunto.zip y descomprimirlo. Luego ejecutáis mongo localhost:vuestroPuerto --shell ruta/cargaPuntuaciones2.js.
Prestad atención a utilizar el puerto en el que escucha vuestra instancia de MongoDB y la ruta en la que habéis descomprimido el archivo anterior. Si le echáis un vistazo veréis que cambia de base de datos, vacía la colección puntuaciones2 y luego la alimenta con 500 documentos (con puntuaciones aleatorias).
Para imponer condiciones sobre campos de un subdocumento utilizamos un punto para separar el campo donde se guarda el subdocumento y el campo del subdocumento, y fijaros que al incluir un punto es imprescindible utilizar las comillas. Esto se conoce como notación del punto (dot notation).
08:53
Cuando se trata de imponer condiciones sobre un array de documentos tenemos que utilizar otro operador. Vamos a trabajar con una colección de datos de puntuaciones con un nuevo modelo de documento.
Si queréis utilizar la colección en vuestro entorno de trabajo podéis descargar el archivo 3.OperadorElemMatch.zip y descomprimirlo.
Luego ejecutáis mongo localhost:vuestroPuerto --shell ruta/cargaPuntuaciones3.js. Prestad atención a utilizar el puerto en el que escucha vuestra instancia de MongoDB y la ruta en la que habéis descomprimido el archivo anterior.
Para que las condiciones impuestas se apliquen a cada uno de los documentos de un array, y no a todos ellos como una unidad, usaremos el operador $elemMatch.
Por último veremos un ejemplo de utilización del operador $elemMatch en NodeJS.
Condiciones sobre subdocumentos
2 questions
07:51
Vimos que para incluir un campo en la proyección se pone a 1, y para no hacerlo se pone a cero. En el caso de los campos de tipo array, hay más posibilidades. Por ejemplo, queremos obtener sólo algunos de los elementos del array. Para eso tendremos que recurrir al uso del operador $slice.
Utilizando este operador podemos recuperar, por ejemplo, los dos primeros primeros elementos de un array, o los dos últimos, el segundo y el tercero, o el antepenúltimo y el penúltimo.
12:19
Vimos que para incluir un campo en la proyección se pone a 1, y para no hacerlo se pone a cero. En el caso de los campos de tipo array, hay más posibilidades.
Por ejemplo, buscamos los clientes que tienen como preferencia el Tenis o el Padel, pero sólo queremos conocer la primera de las coincidencias. Como vamos a aplicar condiciones de filtrado en las preferencias, para recuperar sólo la primera de ellas utilizaremos el operador $.
Ahora supongamos que queremos obtener la primera evaluación superior a 90 entre un determinado grupo de alumnos. En el criterio de filtrado no utilizamos condiciones sobre las evaluaciones, así que recurriremos al operador $elemMatch en este caso.
Operadores de proyección
2 questions
02:12
En general las operaciones de lectura que se realizan en MongoDB resultan en la creación de un cursor, que nos permite acceder a los resultados de la operación.
De modo general diremos que la aplicación que solicita una operación de lectura es la responsable de consumir los resultados. Mediante el uso del cursor podrá averiguar cuántos documentos hay, recuperar el siguiente, averiguar si quedan documentos por recuperar,...
El servidor elimina los cursores tras un determinado tiempo de actividad (10 minutos actualmente).
04:45
En realidad MongoDB devuelve los resultados de una operación de lectura en lotes (batch). Normalmente el primero de ellos tiene 101 documentos o los suficientes para superar 1 MB, mientras que los siguientes tienen 4 MB. Se puede cambiar el tamaño del lote a un número concreto de documentos con cursor.batchsize(tamaño).
El driver utilizado en la aplicación es el encargado de trabajar con este lote de documentos, y si la aplicación consume todos los documentos del lote y pide más, se recuperará el siguiente lote.
Durante el tiempo de utilización de un cursor pueden tener lugar operaciones de escritura que pueden interferir con él. Es decir, documentos que cumplen con las condiciones impuestas en la operación de lectura, pero que aún no han llegado en un lote a la aplicación, puede que nunca lleguen si sufren una modificación que hace que ya no cumpla las citadas condiciones o si son eliminados.
Por tanto, el cursor no está aislado (isolated) durante el tiempo que está activo. Incluso puede que un documento aparezca varias veces en algunos casos concretos de modificación de documentos. Esta repetición se puede evitar con cursor.snapshot()
08:33
Para saber qué podemos hacer con un cursor en el shell podemos escribir db.nombre_coleccion.find().help(). Pra ver si quedan documentos en el cursor haremos cursor.hasNext(), mientras que para acceder al siguiente documento del cursor haremos cursor.next().
Otro método muy útil es cursor.forEach( function ) que itera el cursor para aplicar una función javascript a todos los documentos devueltos.
Con cursor.toArray() guardamos en un array todos los documentos devueltos. Hay que tener cuidado con este último, pues carga en memoria todos los documentos para llevar a cabo su misión.
Para una lista detallada de todos ellos podemos recurrir a http://docs.mongodb.org/manual/reference/method/#js-query-cursor-methods.
08:46
Tres de los métodos que más utilizaremos en un cursor son cursor.sort( patrón ordenación), cursor.limit( número ) y cursor.skip( número ). El primero de ellos ordena los resultados antes de devolverlos según el patrón proporcionado. Se utiliza JSON para especificar el patrón de ordenación.
El segundo se utiliza para limitar el número de documentos recuperados, mientras que el tercero sirve para descartar un número determinado de los documentos iniciales.
¿Es importante el orden de sort, limit y skip? En realidad no, puesto que realmente lo que llega al servidor de MongoDB es un mensaje del MongoDB Wire Protocol, y éste es el mismo sea cuál sea el orden.
Otra cuestión a tener en cuenta es el hecho de que no es el shell el que recibe todos los documentos, los ordena, salta algunos y los limita, sino que es el servidor el que realiza estas operaciones.
Por último vemos un ejemplo en NodeJS con ordenación, limitación y salto de documentos, cuyo código tenéis en el archivo 3.OrdenarLimitarSaltar.zip
07:28
A partir de la versión 2.6 de MongoDB se puede abortar una operación de lectura tras un tiempo especificado. Esto se hace con el método maxTimeMS del cursor. Un ejemplo sería db.puntuaciones.find().maxTimeMS( 300 ), que aborta la operación al cabo de 300 milisegundos.
En este tiempo no se tiene en cuenta la latencia de red, ni el tiempo en el que el cursor no consume documentos. Es decir, sólo se tiene en cuenta el tiempo en el que se están recuperando documentos del cursor.
Para ver un ejemplo vamos a utilizar una colección de puntuaciones. Si queréis utilizar la colección en vuestro entorno de trabajo podéis descargar el archivo 3.CancelacionOperaciones.zip y descomprimirlo.
Luego ejecutáis mongo localhost:vuestroPuerto --shell ruta/cargaPuntuaciones.js. Prestad atención a utilizar el puerto en el que escucha vuestra instancia de MongoDB y la ruta en la que habéis descomprimido el archivo anterior.
Hacemos db.puntuaciones.find().maxTimeMS( 1 ), y pulsamos it en la consola hasta que nos aparezca un mensaje de error.
Cursores
5 questions
Section 4: Operaciones de escritura
03:11
Esta sección está centrada en las operaciones de escritura que se pueden realizar en MongoDB. Ya vimos brevemente cómo se insertan documentos, ahora veremos cómo se modifican y se eliminan, así como otras cuestiones que afectan en general a las operaciones de escritura.
07:23
En MongoDB se pueden actualizar documentos de dos maneras: sustituyendo el documento existente por uno nuevo, o modificando algunos de los campos del existente. Para los ejemplos de esta unidad utilizaremos la colección de datos de clientes de un gimnasio.
Si queréis utilizar la colección en vuestro entorno de trabajo podéis descargar el archivo 4.ActualizacionSustitutiva.zip y descomprimirlo. Luego ejecutáis mongo localhost:vuestroPuerto --shell ruta/cargaPreferencias.js. Prestad atención a utilizar el puerto en el que escucha vuestra instancia de MongoDB y la ruta en la que habéis descomprimido el archivo anterior.
Empecemos sustituyendo documentos. Para ello utilizamos el método update, al que hay que pasar dos documentos JSON. El primero para indicar qué condiciones ha de cumplir el documento a actualizar, y el segundo el documento de sustitución.
08:57
La actualización sustitutiva es poco común. Lo habitual es modificar sólo algunos campos. Esto lo haremos con con el método update, pero ahora proporcionando en el segundo parámetro una expresión de actualización, en vez de un documento de sustitución.
Una operación de actualización es por ejemplo { $set : { fechaAlta : new Date() } }, que actualiza el campo fechaAlta de un documento a la fecha actual. $set es un operador de actualización.
Para eliminar un campo de un documento se utiliza el operador $unset . Otros operadores de actualización son $inc y $rename. El segundo sirve para cambiar el nombre de un campo, mientras que el primero incrementa el valor de un campo con el valor indicado.
11:09
A partir de la versión 2.6 de MongoDB aparecen operadores nuevos de actualización. Por ejemplo $mul, que sirve para multiplicar el valor de un campo. O $bit, para realizar operaciones bit a bit de tipo and, or o xor.
También son nuevos los operadores de actualización $min y $max, que cambian el valor de un campo sólo si el nuevo valor es menor o mayor que el actual.
Y por último tenemos $currentDate que actualiza el valor de un campo a la fecha actual.
07:22
Vemos un par de ejemplos de actualizaciones con NodeJS. Una sustitutiva y otra modificativa. Ambas se llevan a cabo con el método update, que trabaja de forma muy similar a como lo hacemos en el shell.
El código de los ejemplos los podéis encontrar en el archivo 4.Actualizacion.NodeJS.zip
Actualizar documentos
4 questions
13:43
Para modificar el campo de preferencias necesitaremos recurrir a los operadores de actualización de arrays ($push, $pop, $pull, $pullAll, $addToSet). Para añadir una preferencia recurriremos a los operadores $push o $addToSet. El segundo comprueba si el valor a añadir ya existe, mientras que el primero no lo hace.
Para eliminar el primer o el último valor de las preferencias de un cliente tenemos el operador $pop. Para introducir varias preferencias de una vez podemos usar el operador $pushAll. Desde la versión 2.4 de MongoDB se recomienda hacer esto con los operadores $push o $addToSet y el modificador $each.
Si queremos eliminar varias preferencias de una vez podemos usar los operadores $pullAll o $pull.
06:59
El modificador $slice del operador $push aparece siempre junto con un $each. Nos permite quedarnos con la parte final de un array tras añadir algunos elementos a éste.
A partir de la versión 2.6 de MongoDB también podemos quedarnos con la parte inicial del array. Si proporcionamos una array vacío a $each, no se añade nada y se limita el array tal y como especifica $slice.
09:45
El modificador $sort aparece siempre junto con un $each. En la versión 2.4 de MongoDB era necesario incluirlo junto con los modificadores $slice y $each. Además sólo podía ordenar arrays que tuviesen documentos, y lo hacía por sus campos no por el documento completo.
En la versión 2.6 ya no es necesario usarlo junto al modificador $slice, se pueden ordenar arrays que tengan documentos y otros tipos de datos, y se pueden ordenar los documentos de un array por sus campos o por el documento completo.
Si los valores de un array son documentos, y queremos ordenar por un campo de esos documentos haremos $sort : { campoDocumento : 1 }. Si los valores de un array no son documentos se ordena con $sort : 1. Para el primer caso vamos a trabajar con una colección de datos de puntuaciones con un modelo de documento que ya hemos visto.
Si queréis utilizar la colección en vuestro entorno de trabajo podéis descargar el archivo 4.ModificadoresOperadorPush.Sort.zip y ejecutáis mongo localhost:vuestroPuerto --shell ruta/cargaPuntuaciones3.js. Prestad atención a utilizar el puerto en el que escucha vuestra instancia de MongoDB y la ruta en la que habéis descomprimido el archivo anterior.
04:36
Si queremos añadir nuevos elementos a un array en otra posición que no sea la última, tendremos que usar el operador $position, teniendo en cuenta que la primera posición es el cero.
En la versión 2.4 el orden de los modificadores de $push era importante ($each, $slice). En la versión 2.6 da igual. El orden de operaciones es siempre: añadir elementos, ordenar, limitar y almacenar.
10:35
Podemos modificar la primera ocurrencia de un valor dentro de un array. Supongamos que queremos cambiar el nombre de la preferencia Spinning por Bicicleta estática para un cliente. La expresión de actualización sería { $set : { "preferencias.$" : "Bicicleta estática" } } . Fijaros cómo hemos de utilizar preferencias.$, puesto que no sabemos en qué posición del array de preferencias estará Spinning en cada caso.
Es importante destacar que si Spinning apareciese más de una vez en una array de preferencias, con lo anterior sólo cambiaríamos la primera aparición, pues así es como funciona el operador $.
Si supiéramos la posición que ocupa Spinning en el array de preferencias podríamos haber utilizado "preferencias.posicionConcreta", teniendo en cuenta que el primer elemento de un array es el 0.
Si los elementos de un array son documentos, también podemos usar el operador $ para actualizar campos sin saber qué posición ocupa cada documento en el array. La sintaxis sería parecida a lo anterior, "campoDocumento.$.campoSubdocumento".
Modificar arrays
6 questions
05:49
En ocasiones puede suceder que no estemos muy seguros de si la condición que ponemos en la actualización la cumple algún documento. Y a pesar de ello queremos que si es así, se cree un nuevo documento.
Esto se puede hacer añadiendo un tercer parámetro a db.nombre_coleccion.update, { upsert : true }. Cuando no indicamos nada, upsert está a false.
07:18
Hasta ahora todas las operaciones de actualización vistas afectaban sólo a un documento por el criterio de filtrado escogido, pero también porque implícitamente hemos impedido que la operación afecte a más de un documento.
En MongoDB, por defecto las actualizaciones sólo afectan a un único documento. Cuando queramos que afecten a más de un documento tendremos que usar un criterio de filtrado menos restrictivo y añadir un parámetro a db.nombre_coleccion.update, { multi : true }.
Las actualizaciones múltiples son, como el resto de operaciones en MongoDB, atómicas a nivel de documento, así que si afectan a más de uno, puede que entre medias tengan lugar otras operaciones.
Por último veremos un ejemplo de actualización múltiple en NodeJS, cuyo código podéis encontrar en el archivo 4.ActualizacionesMultiples.zip
Upsert y actualizaciones múltiples
3 questions
05:29
Para eliminar documentos ejecutaremos db.nombre_coleccion.remove( condicion ). A modo de comprobación antes de eliminar documentos, podemos hacer db.nombre_coleccion.find( condicion ) y/o db.nombre_coleccion.find( condicion ).count() para ver qué y/o cuántos documentos se eliminan.
Podemos eliminar todos los documentos de una colección con db.nombre_coleccion.remove( {} ), pero en general es más rápido eliminar la colección con db.nombre_coleccion.drop(). Lo primero elimina uno a uno cada documento, mientras que lo segundo elimina la propia colección y datos de un fichero.
En todo caso hay que tener en cuenta que si eliminamos todos los documentos de una colección con un drop, también estamos eliminando los índices existentes. Antes de volver a introducir documentos deberíamos reconstruir los índices.
Por último veremos un ejemplo de eliminación de documentos en NodeJS, cuyo código podéis encontrar en el archivo 4.EliminarDocumentos.zip
Eliminar documentos
2 questions
05:56
En MongoDB existe la posibilidad de recuperar y modificar/eliminar un documento de forma atómica, utilizando el comando findAndModify.
Vamos a ver su sintaxis y sus opciones. Todos los parámetros son opcionales, a excepción de remove y update, que son obligatorios y excluyentes. Los tres parámetros booleanos por defecto están a false.
Si indicamos new : true se devolverá el documento tras modificar. En caso contrario se devolverá el documento antes de modificar.
En el parámetro query indicamos la condición para encontrar el documento a modificar/eliminar. Si varios documentos cumplen la condición, podemos utilizar el parámetro sort para ordenarlos y no dejar al azar cuál es el que se modifica/elimina.
El parámetro fields nos permite indicar una proyección, para indicar explícitamente qué campos del documento queremos recuperar. Mientras que upsert : true indica que en el caso que ningún documento cumpla la condición, debe insertarse un nuevo documento.
07:05
Vamos a ver un ejemplo de una cola de tareas, de la que recuperaremos la información con findAndModify. Inicialmente trabajaremos desde el shell, para posteriomente ver un ejemplo con NodeJS, cuyo código tenéis en el archivo 4.EjemplosFindAndModify.zip
Recuperar y modificar documentos
2 questions
09:39
Hasta ahora hemos visto distintos ejemplos de operaciones de escritura, pero lo que no hemos hecho aún es solicitar una respuesta del servidor que nos clarifique qué ha sucedido realmente.
En el shell de MongoDB podemos ejecutar db.getLastError() para comprobar si la última instrucción ejecutada provocó errores o no.
Alternativamente podemos ejecutar db.runCommand( { getLastError : 1 } ) para obtener información más detallada de lo ocurrido, que es prácticamente equivalente a db.getLastErrorObj().
Probemos a ver qué información nos devuelve este comando tras ejecutar algunas de las operaciones que hemos visto hasta ahora. Empezaremos consultando una colección, para luego insertar un nuevo documento. Tras ello intentaremos insertar de nuevo el mismo documento, para provocar un error de clave duplicada.
Si cometemos un error de sintaxis el propio shell nos advierte de un problema sin necesidad de ejecutar db.runCommand( { getLastError : 1 } ), pero si lo ejecutamos no informa de errores. Esto es porque el shell no ha enviado nada al servidor, y la última operación ejecutada es la anterior.
Probamos también a realizar una actualización normal y otra con { upsert : true }.
09:09
El comando getLastError tiene unas opciones para cambiar el tipo de comprobaciones que queremos realizar. Esto es útil sobre todo cuando trabajamos con replicación, y lo veremos más adelante. Básicamente se trata de indicar cuántos equipos de un conjunto de replicación deben confirmar el éxito de la operación. Esto se hace con db.runCommand( { getLastError : 1 , w : número de equipos } ).
Si w es 0, ignoramos los errores. Los drivers lo único que tratan de detectar en este caso son errores de red. Si w es 1, se espera a que un equipo confirme la operación. También podemos añadir un parámetro para establecer un tiempo máximo de espera, con db.runCommand( { getLastError : 1 , w : 1, wtimeout : milisegundos } ).
También hay otras opciones referidas al journaling. Con la opción db.runCommand( { getLastError : 1 , j : 1 } ) las operaciones de escritura no se confirman hasta que llegan a los archivos del journal. En el caso normal, las operaciones se confirman al llegar a memoria.
Algo más exigente que lo anterior sería forzar que se guarden los datos en los archivos de disco antes de confirmar las operaciones de escritura, con db.runCommand( { getLastError : 1 , fsync : 1 } ).
13:52
En la versión 2.6 de MongoDB, las operaciones de escritura (insert, update y remove) se integran con la comprobación de errores, de modo que cada vez que realizamos una de ellas, se comprueban los errores de manera automática.
Se hace necesario por tanto un parámetro adicional (writeConcern), para cuando queramos realizar una operación de escritura modificando el modo por defecto de comprobación de errores (w : 1).
Las operaciones de escritura ahora devuelven un documento de tipo WriteResult, con información de las operaciones: documentos eliminados, documentos modificados, documentos insertados,... Vamos a ver los ejemplos que hemos visto con la versión 2.4.
Comprobación de errores
3 questions
06:44
A partir de la versión 2.6 de MongoDB se pueden realizar operaciones de escritura masivas en una colección agrupando las operaciones. Para ello se crea un objeto que almacena las operaciones.
Las operaciones se pueden almacenar por orden, para luego ejecutarlas en serie. Si falla una operación, las restantes no se llevarán a cabo.
Si almacenamos las operaciones sin orden, se ejecutarán en paralelo. Si falla una operación, las restantes si se llevarán a cabo.
Se pueden añadir operaciones de inserción, eliminación, reemplazamiento, o actualización.
Operaciones de escritura masivas
3 questions
Section 5: Fin del curso
Fin del curso
05:03

Students Who Viewed This Course Also Viewed

  • Loading
  • Loading
  • Loading

Instructor Biography

José Antonio Sánchez Ortiz, Programador web y formador técnico

Ingeniero Superior de Telecomunicaciones, casi desde los inicios de mi vida laboral (finales de los 90) me especialice en acceder a bases de datos desde Internet, lo que hoy probablemente se conoce más como programador web.

Fundamentalmente he utilizado la plataforma LAMP, aunque en los últimos años estoy incorporando nuevas tecnologías a mi curriculum (Nginx, MongoDB, NodeJS,...).

También he impartido cursos relacionados con la informática (programación de aplicaciones, office, internet,...)

Ready to start learning?
Take This Course