MongoDB: introducción y comandos básicos

Si eres nuevo en MongoDB, aquí te dejo una serie de comandos básicos que seguro vas a necesitar en algún momento.

Antes de nada, si vienes de MySQL o simplemente si no conoces los conceptos básicos de MongoDB y de las bases de datos no relacionales, recuerda:


Los datos se guardan en documentos bajo formato JSON, agrupados en colecciones dentro de las bases de datos. Es decir, en MongoDB las colecciones son lo que las tablas en MySQL, y los documentos lo que las lineas dentro de una tabla. La consecuencia inmediata de esta diferencia es que los datos que vayas a guardar ya no se limitan a la estructura de la tabla, sino que cada documento puede contener diferentes campos.

Lo que en MySQL sería una tabla con tres columnas, como por ejemplo en la tabla libros una columna para título, otro para autor y otro para ISBN, en MongoDB cada documento podría tener una apariencia como ésta:

{
  _id: ObjectId(598368765654adf45ec7),
  nombre: "nombre_del_libro",
  autor: "autor_del_libro",
  ISBN: "3485516825"
}

con la diferencia de que si en algun documento queremos guardar más campos fuera o dentro de los campos actuales, se podría hacer sin problema. Por ejemplo, varios autores y otro campo para precio:

{
  _id: ObjectId(598368765654adf45ec7),
  nombre: "nombre_del_libro",
  autor: [ "nombre_de_un_autor", "nombre_de_otro_autor"],
  ISBN: "3485516825",
  precio: "35"
}

De hecho no hay casi ningún tipo de límite en este sentido, podríamos seguir añadiendo elementos y subelementos:

{
  _id: ObjectId(598368765654adf45ec7),
  nombre: "nombre_del_libro",
  autor: [ {
                nombre: "nombre_de_un_autor",
                nacionalidad: "nacionalidad_del_autor"
              },
             {
                nombre: "nombre_de_un_autor",
                nacionalidad: "nacionalidad_del_autor"
              }],
  ISBN: "3485516825",
  precio: "35"
}

He dicho "casi" porque sí que hay algunos límites, como por ejemplo:
  • Los documentos no pueden sobrepasar los 16Mb
  • No pudes añadir más de 100 niveles de "subelementos" o nesting. 

En cuanto al campo "_id", MongoDB lo crea por defecto de forma automática. Ese número no es solo una id única, sino que guarda cierta información sobre el documento como la hora en la que se creó. Sería algo parecido al número de fila en una tabla MySQL.
Por último, decir que en MongoDB no es necesario terminar los comandos con punto y coma.

Conectarte a mongo:

En local basta con usar el comando mongo, pero si quieres conectarte a un host remoto:

> mongo direccióndelhost:puerto/nombre_database -u nombredeusuario -p password

Crear y usar una base de datos:

> use Nombre_base_de_datos

Mostrar las bases de datos:

> show dbs

En MongoDB solo se mostrarán las bases de datos que contengan documentos. Es decir, tras crear una base de datos, hasta que no insertes nada, no se mostrará con este comando.

Estadísticas:

> db.stats()

Te mostrará el número de colecciones, y documentos, su tamaño, nombre de la base de datos,  etc..

Crear una coleccion:

> db.createCollection(nombre, opciones)

Realmente no es necesario hacerlo, pues al insertar un documento en una colección que no exista, la colección se creará automáticamente. Sólo tiene sentido cuando quieras especificar algunas configuraciones de la colección, ya que como segundo argumento se le pueden pasar ciertas cosas como si debe haber un máximo de documentos permitidos.

Insertar un documento:

Por ejemplo, y siguiendo el ejemplo de la colección de libros, para insertar un libro:

> db.libros.insert({nombre: "El Quijote", autor: "Cervantes", ISBN: "123456789"})

Mostrar documentos:

Esto sería como el SELECT de MySQL. Por ejemplo, un SELECT * FROM libros sería en MongoDB:

> db.libros.find()

Las condiciones WHERE se ponen entre corchetes. Por ejemplo, si queremos seleccionar dentro de la colección de libros todos los libors que haya escrito Cervantes, lo que en MYSQL sería

SELECT * FROM libros WHERE autor="Cervantes";

en MongoDB sería:

> db.libros.find({autor:"Cervantes"})

Si sólo queremos mostrar un libro:

> db.libros.findOne({autor:"Cervantes"});

Si queremos que los resultados se nos muestren formateados, añade pretty():

> db.libros.find({autor:"Cervantes"}).pretty();

Si le pasamos más elementos, acuarán como una condición AND.

Por ejemplo, esto sólo mostrará los libros que pertenezcan a Cervantes Y se titulen El Quijote:

> db.libros.find({autor:"Cervantes",nombre:"El Quijote"})

Si lo que queremos en usar la condición OR, por ejemplo, mostrar los libros que pertenezcan a Cervantes O a Quevedo:

> db.libros.find({ $or: [ {nombre:"Cervantes"},{nombre:"Quevedo"} ] });

Update:

Dentro del primer parámetro buscaríamos el elemento a cambiar según las reglas del find mostradas anteriormente. En el segundo argumento, los campos a cambiar.

Por ejemplo, si queremos cambiar el nombre de "El Quijote" a "El Quijote de La Mancha"

> db.libros.update( {nombre:"El Quijote"}, { $set: {nombre:"El Quijote de La Mancha"} });

Guardar:

Si lo que queremos es reemplazar por completo un documento existente, basta con pasar el "_id", en el primer parámetros y el nuevo documento en el segundo:

> db.libros.save({_id:XXX},{nuevo_documento_aqui});

Borrar una base de datos:

> db.nombre_de_la_base_de_datos.dropDatabase();

Borrar una colección:

> db.libros.drop();

Borrar un documento:

Pasándole las condiciones a buscar. Por ejemplo, borrar todos los libros de Cervantes:

> db.libros.remove({autor:"Cervantes"});

Si queremos un número determinado de documentos, pasamos dicho número como segundo parámetro:

> db.libros.remove({autor:"Cervantes"}, 1)

Entradas populares de este blog

Express.js: lenguaje dentro de la URL