Primeros pasos con MongoDB

first-steps-mongodb-720x340Ahora que ya hemos instalado MongoDB en nuestra máquina (Instalar MongoDB en Ubuntu 14.04), y tenemos el servicio corriendo, vamos a ver cómo crear bases de datos, colecciones y cómo trabajar con nuestros documentos. Además, daremos respuesta a esas preguntas que nos surgen cuando comenzamos a trabajar con una tecnología nueva para nosotros.

Las primeras preguntas que nos podemos hacer son:

  • ¿Cómo comprobamos la versión de MongoDB que tenemos instalada?
Podemos consultarlo sin abrir la conexión, así:

[pastacode lang=»markup» message=»» highlight=»» provider=»manual»]

[/pastacode]

Veremos que MongoDB también nos lo dice cuando abrimos una conexión desde la shell.
  • ¿Cómo nos conectamos a la base de datos desde la shell?

[pastacode lang=»markup» message=»» highlight=»» provider=»manual»]

[/pastacode]

Por defecto, mongo trata de conectarse a un servicio mongod corriendo en el puerto 27017 del servidor localhost. Podemos cambiar esto utilizando las opciones –host y –port.
By default, mongo looks for a database server listening on port 27017 on the localhost interface. To connect to a server on a different port or interface, use the –port and –host options.
  • Una vez conectados hemos de saber cómo cerrar la conexión
Muy fácil, veamos:

[pastacode lang=»markup» message=»» highlight=»» provider=»manual»]

[/pastacode]

o bien:

[pastacode lang=»markup» message=»» highlight=»» provider=»manual»]

[/pastacode]

o bien matando el proceso mediante kill

[pastacode lang=»markup» message=»» highlight=»» provider=»manual»]

[/pastacode]

  • Si no necesitamos trabajar más con MongoDB ¿cómo paramos la base de datos?
Podemos hacerlo mediante Ctrl+C o, si está corriendo como demonio, matando el proceso:

[pastacode lang=»markup» message=»» highlight=»» provider=»manual»]

[/pastacode]

Cuidado con utilizar kill -9, esto aborta el funcionamiento de la base de datos de una forma brusca y no ordenada, pudiendo dar lugar a inconsistencias y/o pérdida de datos.
  • ¿Nos ayuda MongoDB cuando estoy trabajando desde la línea de comandos?
Disponemos de ayuda a tres niveles, que son:
    • General:

[pastacode lang=»markup» message=»» highlight=»» provider=»manual»]

[/pastacode]

  • A nivel de base de datos:

[pastacode lang=»markup» message=»» highlight=»» provider=»manual»]

[/pastacode]

  • A nivel de colección:

[pastacode lang=»markup» message=»» highlight=»» provider=»manual»]

[/pastacode]

Ya tenemos conexión con MongoDB y, para comenzar a trabajar, lo primero que haremos es crear una base de datos pero, ¿dónde estamos? Si nos hemos fijado en la salida devuelta al conectarnos vemos que decía «connecting to: test». Por defecto MongoDB crea una base de datos llamada «test», a la que nos conecta siempre que no especifiquemos otra.
  • ¿Cómo podemos conectarnos a una base de datos específica, exista o no, directamente al conectarnos desde la shell?

[pastacode lang=»markup» message=»» highlight=»» provider=»manual»]

[/pastacode]

  • ¿Cómo podemos saber a qué base de datos estoy conectado? Consultando el valor del objeto «db»;

[pastacode lang=»markup» message=»» highlight=»» provider=»manual»]

[/pastacode]

  • ¿Cómo podemos consultar las bases de datos que hay ya creadas?

[pastacode lang=»markup» message=»» highlight=»» provider=»manual»]

[/pastacode]

Vemos que MongoDB nos ha conectado a la base de datos que le hemos dicho pero que, sin embargo, ¡no la ha creado! Es al insertar el primer documento cuando el servicio mongod crea tanto la base de datos como la colección.

[pastacode lang=»markup» message=»» highlight=»» provider=»manual»]

[/pastacode]

[pastacode lang=»markup» message=»» highlight=»» provider=»manual»]

[/pastacode]

Ya sabemos que una de las características de MongoDB es que no tiene esquema. Es decir, no necesitamos declarar la estructura y características de nuestras colecciones antes de utilizarlas. Por lo tanto, la colección se creará cuando guardemos en ella algún documento, como hemos visto anteriormente.
MongoDB crea un juego de ficheros por cada base de datos. Estos se guardan en el directorio que hayamos especificado al levantar el servicio mongod o, por defecto, en el directorio: /var/lib/mongodb/
  • ¿Cómo podemos cambiarnos de una base de datos a otra?

[pastacode lang=»markup» message=»» highlight=»» provider=»manual»]

[/pastacode]

  • ¿Cómo consultamos las colecciones que tiene una base de datos?

[pastacode lang=»markup» message=»» highlight=»» provider=»manual»]

[/pastacode]

  • ¿Cómo borramos una colección?
Para borrar la colección, sus datos y metadatos utilizaremos:

[pastacode lang=»markup» message=»» highlight=»» provider=»manual»]

[/pastacode]

Para borrar sólo los documentos de la colección (sin borrar colección ni índices):

[pastacode lang=»markup» message=»» highlight=»» provider=»manual»]

[/pastacode]

  • ¿Cómo borramos una base de datos?
A través del comando siguiente eliminaremos la base de datos en la que estemos trabajando, completa, con todos sus datos y metadatos y, también, los ficheros físicos. El objeto db seguirá apuntando a la base de datos:

[pastacode lang=»markup» message=»» highlight=»» provider=»manual»]

[/pastacode]

[pastacode lang=»markup» message=»» highlight=»» provider=»manual»]

[/pastacode]

  • ¿Por qué MongoDB crea el campo _id en cada documento?
Todos los documentos deben tener un campo _id con un valor único. Si no lo especificamos nosotros, al hacer el insert lo creará mongod automáticamente.
  • ¿Cómo nos referimos a una colección determinada para hacer alguna operación sobre ella?
A través del namespace. Se conoce como namespace en MongoDB a la cadena de texto formada por el nombre de la base de datos, seguida por un punto y seguida por el nombre de la colección. Ejemplo: el namespace de la colección ‘prueba’ de la base de datos ‘test’ será: ‘test.prueba’.
Ya sabemos que el objeto ‘db’ siempre apunta a la base de datos a la que estamos conectados, por lo tanto, al namespace anterior podemos referirnos como ‘db.prueba’.
Para hacer una operación sobre la colección anterior haremos:

[pastacode lang=»markup» message=»» highlight=»» provider=»manual»]

[/pastacode]

  • ¿Qué aspecto tiene la salida de una consulta de un documento?

[pastacode lang=»markup» message=»» highlight=»» provider=»manual»]

[/pastacode]

  • ¿Cómo podemos hacer para ver más clara la salida de una consulta?
Tenemos dos opciones para ver la salida de un modo más legible, que son pretty() y toArray(). Ambas devuelven la salida en un objeto JSON.
La diferencia es que toArray() guarda la salida en memoria RAM y puede ocupar mucho dependiendo de la cantidad de datos que tratemos.

El aspecto conseguido ahora es este:

[pastacode lang=»markup» message=»» highlight=»» provider=»manual»]

[/pastacode]

  • ¿Cómo limitamos la salida para ver sólo unos pocos documentos?
Para esto tenemos la opción limit.

[pastacode lang=»markup» message=»» highlight=»» provider=»manual»]

[/pastacode]

Podemos sustituir la opción limit(1) por esta consulta: db.records.findOne(), que además devuelve la consulta en forma de objeto JSON.
  • ¿Cómo contamos el número de documentos que tiene una colección?

[pastacode lang=»markup» message=»» highlight=»» provider=»manual»]

[/pastacode]

  • ¿Cómo ordenamos una consulta?
En esta consulta estamos ordenando nuestra colección en base a dos campos, el primero de ellos el campo ‘a’ y el segundo el campo ‘b’. El valor ‘1’ indica que la ordenación se hará en ascendentemente y el valor ‘-1’ sirve para indicar que la ordenación la necesitamos descendente.

[pastacode lang=»markup» message=»» highlight=»» provider=»manual»]

[/pastacode]

  • insert

Al hacer un insert MongoDB crea automáticamente un _id para el documento en caso de que no lo hayamos indicado nosotros mismos. El _id es único y no cambia en toda la vida del documento. Podemos insertar un único documento o un array de documentos.

[pastacode lang=»markup» message=»» highlight=»» provider=»manual»]

[/pastacode]

Ejemplos:

[pastacode lang=»markup» message=»» highlight=»» provider=»manual»]

[/pastacode]

Así se inserta un array de documentos:

[pastacode lang=»markup» message=»» highlight=»» provider=»manual»]

[/pastacode]

  • find

[pastacode lang=»markup» message=»» highlight=»» provider=»manual»]

[/pastacode]

es opcional y sirve para indicar qué campos quiero recuperar. Es un documento en el que indicamos el nombre del campo y un valor que puede ser: 1 ó true ó 0 ó false. Si lo omitimos la consulta nos devolverá todos, including the _id field.
Ejemplos:

[pastacode lang=»markup» message=»» highlight=»» provider=»manual»]

[/pastacode]

Así consultamos la colección completa

[pastacode lang=»markup» message=»» highlight=»» provider=»manual»]

[/pastacode]

Esta consulta nos devuelve todos los datos de aquellos documentos cuyo campo ‘name’ sea igual a ‘Charles’

[pastacode lang=»markup» message=»» highlight=»» provider=»manual»]

[/pastacode]

Esta consulta nos devuelve, de todos nuestros documentos, sólo el campo ‘name’

[pastacode lang=»markup» message=»» highlight=»» provider=»manual»]

[/pastacode]

Aquí consultamos los nombres y precios de aquellos productos cuyo precio sea mayor o igual a 200. En MongoDB podemos utilizar todo tipo de operadores, los podéis consultar en la documentación oficial: http://docs.mongodb.org/manual/reference/operator/query/
Las opciones que tenemos para realizar consultas son muchas más que las que he mostrado aquí. Para aquellos que tengáis interés en investigar más a fondo os dejo el enlace a la documentación de MongoDB: http://docs.mongodb.org/manual/reference/method/db.collection.find/
  • remove

[pastacode lang=»markup» message=»» highlight=»» provider=»manual»]

[/pastacode]

justOne es un parámetro de tipo boolean que sirve para limitar el borrado a un sólo documento cuando es true.
Ejemplos:

[pastacode lang=»markup» message=»» highlight=»» provider=»manual»]

[/pastacode]

En este ejemplo estamos borrando todos los documentos cuyo campo ‘name’ sea igual a ‘Charles’

[pastacode lang=»markup» message=»» highlight=»» provider=»manual»]

[/pastacode]

Así borramos sólo el primer documento de entre todos los que cumplan la condición

  • update

[pastacode lang=»markup» message=»» highlight=»» provider=»manual»]

[/pastacode]

Ejemplos:

[pastacode lang=»markup» message=»» highlight=»» provider=»manual»]

[/pastacode]

Esta sentencia sustituirá todo el documento cuyo _id sea 100 por el que nosotros estamos pasando.

[pastacode lang=»markup» message=»» highlight=»» provider=»manual»]

[/pastacode]

Con esta otro sólo estamos modificando el valor de ‘y’ para el documento de _id igual a 101.

[pastacode lang=»markup» message=»» highlight=»» provider=»manual»]

[/pastacode]

Así incrementamos el valor del campo ‘y’ en 2 unidades.

[pastacode lang=»markup» message=»» highlight=»» provider=»manual»]

[/pastacode]

Aquí estamos añadiendo el valor ‘yellow’ al array de nombre arr

[pastacode lang=»markup» message=»» highlight=»» provider=»manual»]

[/pastacode]

A todos los jugadores de nombre ‘Klaus’ les damos una puntuación de 10

[pastacode lang=»markup» message=»» highlight=»» provider=»manual»]

[/pastacode]

Con esta sentencia añadimos el fútbol a la lista (array) de aficiones de Jacob. Si esa lista no existe se creará por tener a true el ‘upsert’. En caso de que la lista exista y ya incluya el fútbol este no se añade para no duplicarlo, esto lo conseguimos gracias a $addToSet.

Podemos modificar uno o varios documentos de una colección. Podemos modificar ciertos campos de un documento o documentos, o remplazar documentos completos en función del parámetro .

Por defecto, sólo se modifica un documento. Para modificar más de uno debemos poner a true la opción ‘multi’.

La opción ‘upsert’ también es de tipo boolean y por defecto su valor es false.  Nos permite crear un documento nuevo cuando no existe ninguno en la colección que cumple nuestros criterios.

Para saber más acerca de las posibilidades que tenemos podemos consultar la documentación: http://docs.mongodb.org/manual/reference/method/db.collection.update

  • ¿Cómo sabemos si una sentencia ha ido bien o no?
La propia consulta devuelve el estatus (Write methods return the status of the write operation, including error information si la ha habido con el código y su descripción). Veamos unos ejemplos:

[pastacode lang=»markup» message=»» highlight=»» provider=»manual»]

[/pastacode]

[pastacode lang=»markup» message=»» highlight=»» provider=»manual»]

[/pastacode]

[pastacode lang=»markup» message=»» highlight=»» provider=»manual»]

[/pastacode]

[pastacode lang=»markup» message=»» highlight=»» provider=»manual»]

[/pastacode]

Con todo esto ya podemos hacer la mayor parte de las operaciones que un usuario normal necesita.
En el próximo artículo veremos cómo hacer consultas agregadas utilizando el aggregation framework.
Note: Photo courtesy of freedigitalphotos.net and thepathtraveler

Dejar un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

11 − 7 =