Introducción a MongoDB
MongoDB es un sistema de gestión de bases de datos NoSQL de código abierto, diseñado para proporcionar una solución de almacenamiento de datos escalable y de alto rendimiento para aplicaciones web modernas. Desarrollado en C++, este sistema se basa en un modelo de almacenamiento de documentos, donde cada registro es un "documento" con una estructura flexible y dinámica. Los documentos en MongoDB son similares a objetos JSON, permitiendo que los valores de los campos contengan otros documentos, arrays o arrays de doucmentos, lo que facilita la representación de estructuras de datos complejas.
Tipos de Datos en MongoDB
La flexibilidad de los documentos de MongoDB se apoya en una variedad de tipos de datos, los cuales son parte del formato BSON (Binary JSON), la representación binaria de JSON utilizada por MongoDB para el almacenamiento.
| Tipo de Dato | Descripción |
|---|---|
String |
Cadenas de texto. MongoDB requiere que las cadenas sean UTF-8 válido. |
Integer |
Números enteros. Pueden ser de 32 o 64 bits, dependiendo de la arquitectura del servidor. |
Boolean |
Valores lógicos: true o false. |
Double |
Números de coma flotante de doble precisión. |
Min/Max keys |
Utilizados internamente para comparar un valor con el límite inferior o superior de los elementos BSON. |
Arrays |
Permite almacenar listas de valores o múltiples valores asociados a una sola clave. |
Timestamp |
Marca de tiempo. Se usa para registrar el momento exacto de una modificación o inserción de documento. |
Object |
Para documentos anidados (incrustados dentro de otros documentos). |
Null |
Representa un valor nulo o inexistente. |
Symbol |
Similar a String, pero se usa generalmente en lenguajes que manejan tipos de símbolos específicos. |
Date |
Almacena fechas y horas en formato de tiempo UNIX. Se pueden crear objetos Date con información de año, mes y día. |
Object ID |
Un identificador único de 12 bytes para cada documento en una colección. |
Binary Data |
Para almacenar datos binarios genéricos. |
Code |
Permite almacenar código JavaScript directamente dentro de un documento. |
Regular expression |
Para almacenar expretiones regulares. |
Gestión de Bases de Datos
MongoDB ofrece comandos sencillos para administrar las bases de datos desde su shell.
Creación y Selección de Bases de Datos
Para crear una base de datos o seleccionar una existente, se utiliza el comando use. Si la base de datos especificada no existe, MongoDB la crea implícitamente la primera vez que se inserta un documento en una colección dentro de ella.
use miBaseDeDatosEjemplo;
Este comando selecciona la base de datos miBaseDeDatosEjemplo. Si no existía previamente, se establecerá como la base de datos actual para futuras operaciones y se creará al persistir datos.
Visualización de Bases de Datos
Para ver una lista de todas las bases de datos disponibles en el servidor:
show dbs;
Eliminación de Bases de Datos
La base de datos actualmente seleccionada se puede eliminar por completo con el siguiente comando:
db.dropDatabase();
Operaciones con Documentos
En MongoDB, los documentos son la unidad fundamental de datos, análogos a las filas en una base de datos relacional. Estos documentos se organizan en "colecciones", que son similares a tablas. La estructura de un documento, basada en BSON, permite una gran flexibilidad.
Inserción de Documentos
Para añadir nuevos documentos a una colección, se pueden usar los métodos insert() o save().
db.productos.insert({
nombre: 'Televisor LED 4K',
marca: 'ElectroTech',
precio: 799.99,
stock: 50,
caracteristicas: ['Smart TV', 'HDR', '55 pulgadas']
});
Si la colección productos no existe, MongoDB la creará automáticamente al ejecutar el comando de inserción.
El método save() funciona de manera similar a insert(), pero con una particularidad: si el documento proporcionado incluye un campo _id que ya existe en la colección, save() realizará una actualización del documento existente en lugar de insertar uno nuevo.
Actualización de Documentos
MongoDB permite modificar documentos existentes en una colección usando el método update(). La sintaxis general es la siguiente:
db.collection.update(
<criteriosDeBusqueda>,
<actualizaciones>,
{
upsert: <booleano>,
multi: <booleano>,
writeConcern: <documento>
}
);
criteriosDeBusqueda: Un documento que especifica los criterios para seleccionar los documentos a actualizar.actualizaciones: Un documento que especifica las operaciones de actualización a aplicar (ej.,$set,$inc).upsert(opcional): Si estrue, inserta un nuevo documento si no se encuentra ninguno que coincida concriteriosDeBusqueda. Por defecto esfalse.multi(opcional): Si estrue, actualiza todos los documentos que coincidan concriteriosDeBusqueda. Por defecto esfalse(solo actualiza el primer documento encontrado).writeConcern(opcional): Documento que describe el nivel de garantía de escritura.
Ejemplo de actualización simple: Primero, insertamos un documento para trabajar con él:
db.usuarios.insert({
nombre: 'Juan Perez',
edad: 30,
ciudad: 'Madrid'
});
Luego, actualizamos la ciudad de 'Juan Perez':
db.usuarios.update(
{ 'nombre': 'Juan Perez' },
{ $set: { 'ciudad': 'Barcelona', 'codigoPostal': '08001' } }
);
Para modificar múltiples documentos que cumplen con un criterio, se debe establecer el parámetro multi a true. Por ejemplo, para cambiar el estado de todos los productos 'ElectroTech' a 'agotado':
db.productos.update(
{ 'marca': 'ElectroTech' },
{ $set: { 'estado': 'agotado' } },
{ multi: true }
);
El método save() también puede usarse para reemplazar un documento completo si se proporciona un _id existente:
db.usuarios.save(
{
_id: ObjectId("60c72b2f8f9e1c3e4d5f6a7b"), // Un ID de un documento existente
nombre: 'Ana Lopez',
edad: 25,
ciudad: 'Valencia'
}
);
Si el _id no existe, save() insertará un nuevo documento.
Eliminación de Documentos
Para eliminar documentos de una colección, se utiliza el método remove().
db.collection.remove(
<criteriosDeBusqueda>,
{
justOne: <booleano>,
writeConcern: <documento>
}
);
criteriosDeBusqueda(opcional): Documento que especifica qué documentos eliminar. Si se omite, se eliminarán todos los documentos de la colección.justOne(opcional): Si se establece entrueo1, solo se eliminará el primer documento que cumpla con los criterios. Por defecto esfalse(elimina todos los que coincidan).writeConcern(opcional): Nivel de garantía de escritura.
Ejemplo: Eliminar todos los usuarios con edad inferior a 18:
db.usuarios.remove({ 'edad': { $lt: 18 } });
Para eliminar solo un documento que coincida con un criterio (por ejemplo, el primer producto llamado 'Televisor LED 4K'):
db.productos.remove(
{ 'nombre': 'Televisor LED 4K' },
{ justOne: true }
);
Consulta de Documentos
El método principal para recuperar documentos de una colección es find(). Este método devuelve un cursor a los documentos que cumplen los criterios de búsqueda.
db.coleccion.find(<criterios>).pretty();
El método pretty() es útil para visualizar los resultados de forma legible en el shell de MongoDB. Para recuperar un solo documento, se puede usar findOne().
Operadores de Consulta Comunes:
| Operador MongoDB | Formato de Consulta | Ejemplo | Equivalente SQL |
|---|---|---|---|
| Igualdad | { <campo>: <valor> } |
db.productos.find({ "marca": "ElectroTech" }).pretty() |
WHERE marca = 'ElectroTech' |
| Menor que | { <campo>: { $lt: <valor> } } |
db.usuarios.find({ "edad": { $lt: 25 } }).pretty() |
WHERE edad < 25 |
| Menor o Igual que | { <campo>: { $lte: <valor> } } |
db.productos.find({ "precio": { $lte: 500 } }).pretty() |
WHERE precio <= 500 |
| Mayor que | { <campo>: { $gt: <valor> } } |
db.usuarios.find({ "edad": { $gt: 40 } }).pretty() |
WHERE edad > 40 |
| Mayor o Igual que | { <campo>: { $gte: <valor> } } |
db.productos.find({ "stock": { $gte: 100 } }).pretty() |
WHERE stock >= 100 |
| Diferente de | { <campo>: { $ne: <valor> } } |
db.usuarios.find({ "ciudad": { $ne: "Madrid" } }).pretty() |
WHERE ciudad != 'Madrid' |
Condiciones AND
En MongoDB, las condiciones AND se implican automáticamente cuando se especifican múltiples pares clave-valor dentro del mismo objeto de consulta find(). Cada par se separa por comas.
db.coleccion.find({ <clave1>: <valor1>, <clave2>: <valor2> }).pretty();
Ejemplo: Encontrar productos de la marca 'ElectroTech' con un precio superior a 600:
db.productos.find({
'marca': 'ElectroTech',
'precio': { $gt: 600 }
}).pretty();
Esto es análogo a WHERE marca = 'ElectroTech' AND precio > 600 en SQL.
Condiciones OR
Para aplicar condiciones OR, MongoDB utiliza el operador $or. Este operador toma un array de documentos, donde cada documento representa una condición individual.
db.coleccion.find(
{
$or: [
{ <clave1>: <valor1> },
{ <clave2>: <valor2> }
]
}
).pretty();
Ejemplo: Encontrar usuarios que sean de 'Madrid' o tengan una edad mayor a 50:
db.usuarios.find(
{
$or: [
{ 'ciudad': 'Madrid' },
{ 'edad': { $gt: 50 } }
]
}
).pretty();