Blog
MongoDB: Consultas avanzadas y relaciones
- Publicado por: Sergioal
- Categoría: Blog

En la clase anterior hemos visto las consultas sencillas: crear bases de datos, insertar, modificar y seleccionar registros. Ahora veremos consultas más avanzadas y relaciones.
Seleccionar datos
En este ejemplo nos buscará por el campo nombre y nos encontrará ese resultado. Si queremos buscar los registros que tengan en edad más de 20 años, podemos utilizar el operador gt (greather than):
db.alumnos.find({edad: {$gt: 11}})
Si queremos hacer una consulta con un ‘AND’, es decir, que tenga que cumplir con las dos condiciones, podríamos usar el siguiente ejemplo, el cual debe de tener menos de 30 años (less than) y llamarse Raul:
db.alumnos.find( { nombre: "Raul", edad: { $lt: 30 } } )
Podemos usar un ‘OR’, el cual nos devolverá los resultados que contengan una condición u otra:
db.alumnos.find( { $or: [ { nombre: "Raul" }, { edad: { $lt: 30 } } ] } )
También podemos hacer uso de las dos condiciones, y especificar que tenga ambas condiciones, pero en la segunda tiene que cumplir con una de las dos:
db.alumnos.find( { nombre: "Raul", $or: [ { edad: { $lt: 30 } }, { pais: /^E/ } ] } )
Aquí, le hemos especificado que tiene que llamarse Raul, y: o bien tener menos de 30 años o en el campo país que empiece por ‘E’.
Actualizar datos
Para actualizar datos de un sólo registro, podemos usar updateOne, el cual sólo actualizará el primer registro encontrado:
db.alumnos.updateOne( { nombre : "Raul" }, { $set: { pais : "dinamarca", edad : 20 }, $currentDate: { "lastModified": true } } )
Aquí, hemos actualizado la edad y el país, además de que hemos añadido el campo ‘lastModified’, que indica la fecha de última modificación del registro. De igual manera, con updateMany actualizaríamos todos registros que coincidan, no solo el primero.
Cuando ejecutamos el comando, veremos que nos devuelve varios valores, como los siguientes:
{ "acknowledged" : true, "matchedCount" : 1, "modifiedCount" : 1 }
El campo matchedCount indica el número de registros que se han encontrado, mientras que modifiedCount indica los que se han modificado.
Eliminar datos
Podemos eliminar sólo un registro con deleteOne, como en el siguiente ejemplo:
db.alumnos.deleteOne( { nombre: "Raul" } )
De igual forma, nos devolverá el número de registros eliminados:
{ "acknowledged" : true, "deletedCount" : 1 }
Con deleteMany, borraremos varios registros y no sólo uno.
Relaciones
Siguiendo el ejemplo de alumnos, podríamos tener un documento que contenga las direcciones (calle, piso etc.), y podríamos conseguirlo de dos formas: con una relación incrustada o con una relación referenciada.
En una relación incrustada, insertaríamos la dirección dentro del documento de alumnos, como por ejemplo:
db.alumnos.insert( { nombre : "Hugo", edad: 29, direccion: { calle: "Avenida del automovil", numero: 2 } } )
Pero también podríamos almacenar esa información en otro documento y llamar a esa información con dos comandos:
{ "_id":ObjectId("52ffc33cd85242f436000001"), "nombre": "Hugo", edad: 23, "direccion_ids": [ ObjectId("52ffc4a5d85242602e000000"), ObjectId("52ffc4a5d85242602e000001") ] }
Y posteriormente podríamos llamarlo así:
var result = db.alumnos.findOne({"nombre":"Hugo"},{"direccion_ids":1}) var addresses = db.direcciones.find({"_id":{"$in":result["direccion_ids"]}})
Y con esto terminamos la clase de hoy. En la siguiente empezaremos con Mongoose dentro de Node.