lunes, 29 de noviembre de 2010

MongoDB: Tres consejos para la consola

La consola MongoDB es una herramienta administrativa poderosa. Algunas de sus características más útiles no son ampliamente conocidas.

1. Puedes ejecutar ficheros JavaScript

Si tienes una serie de comandos que debes mantener ejecutando, considera ponerlos en un fichero. Por ejemplo, si quieres escribir tu propia versión de mongostat con una única operación de información, puedes crear un fichero llamado myMongoStat.js:

// Impresión de la cabecera
print("inserts\tqueries\ tupdates\tdeletes");

// Impresión constante de las estadísticas
while (true) {
var stats = db.serverStatus();

print(stats.opcounters. insert+"\t"+
stats.opcounters.query+"\t"+
stats.opcounters.update+"\t"+
stats.opcounters['delete']);

sleep(1000);
}


Cosas a anotar:

* No puedes usar asistentes de la consola: cosas como "use foo" ó "show dbs". Para hacer ésto, utiliza los comandos equivalentes de la base de datos (db.getSisterDB("foo") ó admin = db.getSisterDB("admin"); admin.runCommand({ listDatabases:1}) , respectivamente.
* "delete" es una palabra reservada en JavaScript, así que no puedes escribir stats.opcounters.delete, si no que tienes que usar un obtenedor de estilo array asociativo (stats.opcounters["delete"]).

Para eje utar este script, abrir un termina y escribir:

$ ./mongo myMongoStat.js

Puedes hacer ésto con cualquier serie de comandos que utilices regularmente.

2. Puedes ver (casi) el código fuente de cualquier función

¿Curioso con lo que find() está haciendo? ¿No puedes recordar los parámetros de update()? Simplemente ejecuta el comando sin los paréntesis y la consola mostrará su código fuenrte:

> db.foo.update
function (query, obj, upsert, multi) {
assert(query, "need a query");
assert(obj, "need an object");
this._validateObject(obj);
this._mongo.update(this._ fullName, query, obj, upsert ? true : false, multi ? true : false);
}


Por instancia, si intentas imprimir el código de la función nativa Date.parse(), obtendrás lo siguiente:

> Date.parse
function parse() {
[native code]
}


3. Puedes ejecutar cualquier programa

Una característica de la consola poco conocida e indocumentada es que puedes ejecutar cualquier ejecutable desde la consola.

> runProgram("ls", "-l")
sh7056| -rwxr-xr-x 1 root root 41224968 2010-06-01 18:21 mongo
sh7056| -rwxr-xr-x 1 root root 41224968 2010-06-01 18:21 mongod
sh7056| -rwxr-xr-x 1 root root 41224968 2010-06-01 18:21 mongodump
sh7056| -rwxr-xr-x 1 root root 41195810 2010-06-01 18:21 mongoexport
sh7056| -rwxr-xr-x 1 root root 41204267 2010-06-01 18:22 mongofiles
sh7056| -rwxr-xr-x 1 root root 41237850 2010-06-01 18:22 mongoimport
sh7056| -rwxr-xr-x 1 root root 41275461 2010-06-01 18:23 mongorestore