Capítulo II. Conceptos básicos
7. Operaciones básicas en la Shell
En la Shell se pueden realizar cuatro operaciones básicas para manipular y ver datos denominadas CRUD (crear, leer, actualizar o borrar):
a) Crear. El comando insert añade un documento a una colección. Por ejemplo, si se quiere almacenar un post de un blog (figura 10), primero se crea una variable post que representa al documento y que tendrá como claves título, contenido y fecha de publicación:
Figura 10. Creación de la variable post.
A continuación se usa insert para añadirlo a la colección blog (figura 11).
Figura 11. Inserción del documento post en blog.
Ahora se puede recuperar con una llamada a la función find sobre la colección (figura 12).
Figura 12. Ejecución de la función find para recuperar el contenido de blog.
En el ejemplo se puede observar que se ha añadido una clave «_id» y que el resto de las claves se han mantenido intactas.
b) Leer. Los comandos find y findOne pueden ser usados para consultar una colección. Si solo se quiere recuperar un único documento de una colección, se usará findOne (figura 13):
Tanto a find () como a findOne () se les puede pasar como parámetro una condición de recuperación que permite restringir los documentos recuperados. La Shell mostrará automáticamente 20 documentos pero se pueden recuperar más.
c) Actualizar. Para actualizar se dispone del comando update, que toma al menos dos parámetros: un criterio para encontrar el documento que se desea actualizar y el nuevo documento. Por ejemplo, supóngase que en el ejemplo anterior se quiere añadir una nueva clave que represente los comentarios a un post del blog, y que tomará como valor un array de comentarios. Entonces, lo primero que hay que hacer es modificar la variable post y añadir una clave «comentarios» (figura 14):
Figura 14. Adición del campo «comentarios» a la variable post.
A continuación, se actualiza el documento sustituyendo el anterior documento por el nuevo (figura 15):
Figura 15. Sustitución del documento anterior por otro nuevo.
Ahora se puede consultar y ver los cambios mediante findOne (figura 16):
d) Borrar. El comando remove elimina de forma permanente los documentos de una base de datos. Si se llama sin parámetros, elimina todos los documentos de una colección. También puede tomar un documento especificando criterios para su eliminación, como el siguiente ejemplo, que elimina los documentos que tenga en la clave «título» el valor «Mi primer post de mi blog» (figura 17):
Figura 17. Eliminación de un documento con remove.
Además de las operaciones básicas de manipulación de la base de datos, la Shell dispone de otros comandos útiles más orienta- dos a manipular la propia Shell:
a) Configuración de la Shell. Por defecto, la Shell se conec- ta a una instancia local de MongoDB, sin embargo, es posible conectarse a una instancia diferente o puerto especificando el hostname, puerto y base de datos: mongo hostname: puerto/ nombre_base_datos.
A veces puede interesar ejecutar la Shell sin conectarse a una instancia de MongoDB, para lo que se utiliza el comando mongo --nodb (figura 18).
Figura 18. Conexión a la Shell sin conectarse a una instancia de MongoDB.
Una vez conectado se puede conectar a una instancia de MongoDB mediante el comando new Mongo (hostname) y a continuación conectarse a la base de datos (figura 19):
Figura 19. Conexión a una instancia de MongoDB mediante el comando Mongo.
A partir de este momento se puede usar de forma normal la base de datos. Hay que observar que con estos comandos es posible conectarse a diferentes bases de datos o servidores en cualquier momento.
b) Ayuda. Dado que MongoDB es una Shell basado en JavaScript, se puede encontrar información sobre su funciona- miento consultando la documentación de JavaScript. Asimismo se puede encontrar información sobre la funcionalidad de la Shell específica de MongoDB utilizando el comando help (figura 20).
Figura 20. Invocación del comando help ().
En cuanto a la base de datos también se puede encontrar ayuda mediante el comando db.help () y en cuanto a colección mediante el comando db.Nombre_Colección.help (). También
se puede encontrar información sobre una función determinada introduciendo el nombre de la misma sin paréntesis. En este caso se imprimirá el código fuente en JavaScript de la función. Por ejemplo, si se quiere ver cómo funciona la función update, se utilizaría el comando mostrado en figura 21.
Figura 21. Muestra de la ayuda del comando update.
c) Ejecución de JavaScript. Otra característica de la Shell es la posibilidad de ejecutar archivos JavaScript. Para ello se ejecutan en la Shell los scripts de la siguiente forma:
mongo Nombre_Script1.js Nombre_Script2.js.
La Shell ejecuta cada script listado y a continuación abandona la Shell. También es posible ejecutar los scripts en una conexión que no sea la que aparece por defecto especificando primero la dirección: host, puerto y una base de datos concreta, y a conti- nuación la lista de scripts:
mongo --quiet hostname:puerto/base_datos Nombre_ Script1.js Nombre_Script2.js.
Hay que observar en el ejemplo anterior que las opciones de la línea de comandos para ejecutar la Shell van siempre antes de la dirección. En este caso se utiliza la opción –quiet, que evita que se imprima la información de cabecera «MongoDB Shell version…». En este sentido, esta opción se puede utilizar para canalizar la salida de un script de la Shell a otro comando. También es posible imprimir a la salida estándar los scripts usan- do la función print ().
Otra forma de ejecutar scripts desde dentro de la Shell es usar la función load (“Nombre_Script.js”).
Los scripts tienen acceso a la variable db como a otras varia- bles globales, sin embargo, no funcionan algunos de los coman- dos propios de MongoDB, aunque existen otras alternativas a estos en JavaScript (tabla 1):
use prueba db.getSisterDB(“prueba”)
show dbs db.getMongo().getDBs()
show collections db.getCollectionNames()
Tabla 1. Comandos alternativos en JavaScript.
También es posible usar scripts para añadir variables en la Shell. Por ejemplo, se podría tener un script conectarseA () para realizar una inicialización que conecte a una instancia local de MongoDB que se ejecuta sobre un puerto dado y configura la variable db a esa conexión. Si se carga este script en la Shell, el script está ya definido en MongoDB (figura 22):
Figura 22. Definición de un script en MongoDB.
Los scripts también pueden usarse para automatizar tareas comunes y actividades administrativas. Por defecto, la Shell mira- rá en el directorio en que se inició, de manera que, si el script no está en el directorio actual, se puede especificar a la Shell una dirección relativa o absoluta. Por ejemplo, si se quiere poner los scripts de la Shell en el directorio ~/mis-scripts, para cargar el script conectarseA.js se usaría el comando: load (“/home/usua- rio/mis-scripts/conectarseA.js”). Hay que observar que load () no es capaz de resolver el símbolo «~».
Asimismo si se quiere usar el comando run () para ejecutar programas desde la línea de comandos de la Shell, se pasan los argumentos a la función como parámetros:
– run (“ls”, “-l”, “/home/usuario/mis-scripts/”) – sh70352| -rw-r--r-- 1 usuario usuario 2012-12-13 13:15 defineconectarseA.js – sh70532| -rw-r--r-- 1 myUser myUser 2013-02-22 15:10 script1.js – sh70532| -rw-r--r-- 1 myUser myUser 2013-02-22 15:12 script2.js – sh70532| -rw-r--r-- 1 myUser myUser 2013-02-22 15:13 script3.js
Hay que observar que su uso es limitado, dado que la salida se formatea de forma extraña y no soporta la canalización entre diferentes funciones.