MongoDB. Trucos y consejos. Opciones de la consola que quizá no conocías

Robomongo es una aplicación muy útil para gestionar nuestras bases de datos MongoDB. Tiene ciertas características interesantes, que nos pueden hacer la vida más fácil.

En el artículo de hoy, y un poco a parte de la línea general del tutorial de MongoDB, os voy a hablar de algunas funcionalidades de la consola que quizá no conozcáis.

Personalización del prompt

Por defecto, la consola de MongoDB solo nos muestra un signo “>” como indicador. Si queremos modificar este comportamiento, podemos hacer uso del objeto prompt que está definido en nuestra consola.

prompt = function()
 {
    return hostname() + ">";
 }

Con la función anterior lo que conseguimos es que en lugar de mostrar simplemente el signo “>” también se muestre el nombre de la máquina sobre la que estamos trabajando. En mi caso:

CYLON-MACHINE>use people
switched to db people
CYLON-MACHINE>

Usando scripts desde la consola

Lo malo de definir funciones directamente desde la consola, es que estas se eliminan en cuánto terminamos la sesión. Si salimos de la consola de MongoDB y volvemos a conectar, el prompt volverá a ser un simple símbolo “>”.

Además, escribir scripts en la consola es algo bastante tedioso. Cada vez que añadimos un salto de línea, esta queda fija. MongoDB entiende que vas a introducir la siguiente línea del script, por lo que no te deja modificar las anteriores. Si te das cuenta tarde de que has puesto mal algún comando, te toca volver a escribirlo desde el principio. Así que escribir scripts largos es bastante difícil.

Si tenemos funciones que utilizamos habitualmente, podemos cargarlas desde un script. Por ejemplo, imaginemos que tenemos un script como este, al que llamaremos finder.js:

var findLast10 = function()
{ 
    return db.people.find
    (
      {},
      {name:1}
    ).sort({name:-1}).limit(10).pretty(); 
};

prompt = function()
     {
        return hostname() + ">";
     }

print("Datos personalizados cargados correctamente");

En el script anterior creamos una función llamada findLast10 que hace una consulta para devolver ordenados los 10 últimos nombres de la colección people. También añadimos la función que hemos utilizado antes para modificar el prompt. Para cargarlo, usamos el comando load:

> load("finder.js");
Datos personalizados cargados correctamente
true
CYLON-MACHINE>findLast10()
{ "_id" : ObjectId("51ca13be68c55d38628ec6ec"), "name" : "Zoey Waller" }
{ "_id" : ObjectId("51ca13be68c55d38628ec721"), "name" : "Zoey Otis" }
{ "_id" : ObjectId("51ca13be68c55d38628ec658"), "name" : "Zoe Wallace" }
{ "_id" : ObjectId("51ca13be68c55d38628ec7a0"), "name" : "Zoe Hamphrey" }
{ "_id" : ObjectId("51ca13be68c55d38628ec6ef"), "name" : "Victoria Mercer" }
{ "_id" : ObjectId("51ca13be68c55d38628ec6e3"), "name" : "Victoria Fisher" }
{ "_id" : ObjectId("51ca13be68c55d38628ec7dc"), "name" : "Victoria Adamson" }
{ "_id" : ObjectId("51ca13be68c55d38628ec7ce"), "name" : "Vanessa Owen" }
{ "_id" : ObjectId("51ca13be68c55d38628ec6e1"), "name" : "Vanessa Gate" }
{ "_id" : ObjectId("51ca13be68c55d38628ec7f2"), "name" : "Vanessa Davidson" }
CYLON-MACHINE>

Tras cargar el archivo finder.js podemos ver que el prompt vuelve a escribir el nombre de la máquina. También ha definido la función findLast10, que como vemos, se puede ejecutar sin problemas.

Es importante destacar que los archivos js deben estar en el mismo directorio que MongoDB para que pueda encontrarlos. Si queremos usar subdirectorios, podemos añadir la ruta relativa.

> load("scripts/finder.js");

Cargando scripts y variables al iniciar la consola

El anterior truco es muy útil, pero sigue teniendo el problema de que tenemos que cargar el archivo con el comando load cada vez que iniciamos la consola de MongoDB.

Si queremos evitar esto, tendremos que guardar las variables y funciones en un archivo llamado .mongorc.js. Este archivo está ubicado en el Home de nuestro usuario si usamos Linux, o en raiz\usuarios\nombre_usuario si usamos Windows.

De esta manera los scripts, se cargarán automáticamente al iniciar una conexión a la consola.

D:\Software\mongo\2.4>mongo localhost:27666
MongoDB shell version: 2.4.8
connecting to: localhost:27666/test
Datos personalizados cargados correctamente
CYLON-MACHINE>findLast10()
{ "_id" : ObjectId("51ca13be68c55d38628ec6ec"), "name" : "Zoey Waller" }
{ "_id" : ObjectId("51ca13be68c55d38628ec721"), "name" : "Zoey Otis" }
{ "_id" : ObjectId("51ca13be68c55d38628ec658"), "name" : "Zoe Wallace" }
{ "_id" : ObjectId("51ca13be68c55d38628ec7a0"), "name" : "Zoe Hamphrey" }
{ "_id" : ObjectId("51ca13be68c55d38628ec6ef"), "name" : "Victoria Mercer" }
{ "_id" : ObjectId("51ca13be68c55d38628ec6e3"), "name" : "Victoria Fisher" }
{ "_id" : ObjectId("51ca13be68c55d38628ec7dc"), "name" : "Victoria Adamson" }
{ "_id" : ObjectId("51ca13be68c55d38628ec7ce"), "name" : "Vanessa Owen" }
{ "_id" : ObjectId("51ca13be68c55d38628ec6e1"), "name" : "Vanessa Gate" }
{ "_id" : ObjectId("51ca13be68c55d38628ec7f2"), "name" : "Vanessa Davidson" }
CYLON-MACHINE>

Ejecutando funciones almacenadas

MongoDB no tiene procedimientos almacenados, aunque tiene una función parecida: podemos almacenar funciones dentro de la base de datos. Un ejemplo:

db.system.js.save(
{
   _id:"findLast10",
   value: function(){
        return db.people.find
        (
          {},
          {name:1}
        ).sort({name:-1}).limit(10).pretty().toArray();
 }
}); 

Si ejecutamos el código anterior en la consola, estaremos guardando una función JavaScript en la base de datos. La función es la misma que hemos utilizado antes, con la diferencia de que hemos añadido un toArray. Como find en realidad devuelve un cursor, tenemos que añadir el toArray para devolver los resultados, en lugar de el propio cursor.

Para ejecutar nuestra función almacenada, utilizamos el comando eval y el _id de la función:

> db.eval("findLast10()");
[
    {
            "_id" : ObjectId("51ca13be68c55d38628ec6ec"),
            "name" : "Zoey Waller"
    },
    {
            "_id" : ObjectId("51ca13be68c55d38628ec721"),
            "name" : "Zoey Otis"
    },
    {
            "_id" : ObjectId("51ca13be68c55d38628ec658"),
            "name" : "Zoe Wallace"
    },
    {
            "_id" : ObjectId("51ca13be68c55d38628ec7a0"),
            "name" : "Zoe Hamphrey"
    },
    {
            "_id" : ObjectId("51ca13be68c55d38628ec6ef"),
            "name" : "Victoria Mercer"
    },
    {
            "_id" : ObjectId("51ca13be68c55d38628ec6e3"),
            "name" : "Victoria Fisher"
    },
    {
            "_id" : ObjectId("51ca13be68c55d38628ec7dc"),
            "name" : "Victoria Adamson"
    },
    {
            "_id" : ObjectId("51ca13be68c55d38628ec7ce"),
            "name" : "Vanessa Owen"
    },
    {
            "_id" : ObjectId("51ca13be68c55d38628ec6e1"),
            "name" : "Vanessa Gate"
    },
    {
            "_id" : ObjectId("51ca13be68c55d38628ec7f2"),
            "name" : "Vanessa Davidson"
    }
]   

Conclusiones

Aunque la consola de MongoDB en ciertos aspectos no es muy amigable, tiene una serie de opciones que cualquier administrador debería conocer. Teniendo una buena colección con las funciones más utilizadas, nos evitaremos repetir pasos y podremos automatizar mejor las tareas.



Recuerda que puedes ver el índice del tutorial y acceder a todos los artículos de la serie desde aquí.



¿Quiéres que te avisemos cuando se publiquen nuevas entradas en el blog?

Suscríbete por correo electrónico o por RSS