Introducción a MongoDB
¿Qué es MongoDB?
MongoDB es una base de datos NoSQL orientada a documentos. A diferencia de las bases de datos relacionales como MySQL o PostgreSQL, MongoDB almacena datos en formato JSON (BSON, Binary JSON) en lugar de tablas con filas y columnas. Es ideal para aplicaciones que requieren flexibilidad en el esquema y escalabilidad horizontal.
Características principales
- Orientado a documentos: Almacena datos en formato JSON/BSON
- Sin esquema fijo: No requiere definir la estructura de antemano
- Escalabilidad horizontal: Fácil de distribuir en múltiples servidores
- Consultas potentes: Soporta búsquedas complejas y agregaciones
- Índices: Soporta índices para mejorar el rendimiento
Instalar MongoDB en Linux
En Ubuntu/Debian:
# Importar clave GPG
wget -qO - https://www.mongodb.org/static/pgp/server-6.0.asc | sudo apt-key add -
# Agregar repositorio
echo "deb [ arch=amd64,arm64 ] https://repo.mongodb.org/apt/ubuntu jammy/mongodb-org/6.0 multiverse" | sudo tee /etc/apt/sources.list.d/mongodb-org-6.0.list
# Instalar
sudo apt-get update
sudo apt-get install -y mongodb-org
# Iniciar MongoDB
sudo systemctl start mongod
sudo systemctl enable mongod
En CentOS/RHEL:
# Crear archivo de repositorio
sudo nano /etc/yum.repos.d/mongodb-org-6.0.repo
# Agregar contenido:
[mongodb-org-6.0]
name=MongoDB Repository
baseurl=https://repo.mongodb.org/yum/redhat/$releasever/mongodb-org/6.0/x86_64/
gpgcheck=1
enabled=1
gpgkey=https://www.mongodb.org/static/pgp/server-6.0.asc
# Instalar
sudo yum install -y mongodb-org
# Iniciar
sudo systemctl start mongod
sudo systemctl enable mongod
Verificar instalación
sudo systemctl status mongod
mongod --version
Conectarse a MongoDB
Desde la terminal:
mongosh
O con autenticación:
mongosh -u usuario -p contraseña --authenticationDatabase admin
Conceptos básicos
Base de datos: Similar a MySQL, pero no necesitas crearla explícitamente. Se crea al insertar el primer documento.
Colección: Equivalente a una tabla en SQL. Contiene documentos.
Documento: Equivalente a una fila en SQL. Es un objeto JSON/BSON.
Campo: Equivalente a una columna en SQL. Es una propiedad del documento.
Comandos básicos
Ver bases de datos:
show dbs
Usar una base de datos:
use nombre_base_datos
Ver colecciones:
show collections
Crear una colección (implícito al insertar):
db.nombre_coleccion.insertOne({campo: "valor"})
Operaciones CRUD básicas
Insertar documentos:
// Insertar un documento
db.usuarios.insertOne({
nombre: "Juan",
email: "[email protected]",
edad: 30
})
// Insertar múltiples documentos
db.usuarios.insertMany([
{nombre: "María", email: "[email protected]", edad: 25},
{nombre: "Pedro", email: "[email protected]", edad: 35}
])
Consultar documentos:
// Consultar todos
db.usuarios.find()
// Consultar con filtro
db.usuarios.find({nombre: "Juan"})
// Consultar uno
db.usuarios.findOne({edad: {$gt: 30}})
// Consultar con formato legible
db.usuarios.find().pretty()
Actualizar documentos:
// Actualizar uno
db.usuarios.updateOne(
{nombre: "Juan"},
{$set: {edad: 31}}
)
// Actualizar múltiples
db.usuarios.updateMany(
{edad: {$lt: 30}},
{$set: {categoria: "joven"}}
)
Eliminar documentos:
// Eliminar uno
db.usuarios.deleteOne({nombre: "Juan"})
// Eliminar múltiples
db.usuarios.deleteMany({edad: {$lt: 18}})
Operadores de consulta comunes
// Mayor que
db.usuarios.find({edad: {$gt: 25}})
// Menor que
db.usuarios.find({edad: {$lt: 40}})
// Mayor o igual
db.usuarios.find({edad: {$gte: 18}})
// Menor o igual
db.usuarios.find({edad: {$lte: 65}})
// Diferente de
db.usuarios.find({nombre: {$ne: "Juan"}})
// En array
db.usuarios.find({categoria: {$in: ["admin", "moderador"]}})
// No en array
db.usuarios.find({categoria: {$nin: ["banned"]}})
// Y lógico
db.usuarios.find({$and: [{edad: {$gt: 18}}, {edad: {$lt: 65}}]})
// O lógico
db.usuarios.find({$or: [{nombre: "Juan"}, {nombre: "María"}]})
Índices
Los índices mejoran el rendimiento de las consultas:
// Crear índice en un campo
db.usuarios.createIndex({email: 1})
// Crear índice único
db.usuarios.createIndex({email: 1}, {unique: true})
// Crear índice compuesto
db.usuarios.createIndex({nombre: 1, edad: -1})
// Ver índices
db.usuarios.getIndexes()
// Eliminar índice
db.usuarios.dropIndex({email: 1})
Agregaciones
Las agregaciones permiten procesar y transformar datos:
// Contar documentos
db.usuarios.countDocuments({edad: {$gt: 25}})
// Agregación simple (equivalente a GROUP BY)
db.usuarios.aggregate([
{$group: {_id: "$categoria", total: {$sum: 1}}}
])
// Agregación con múltiples etapas
db.usuarios.aggregate([
{$match: {edad: {$gte: 18}}},
{$group: {_id: "$categoria", promedio: {$avg: "$edad"}}},
{$sort: {promedio: -1}}
])
Configurar autenticación
1. Conectarse sin autenticación (primera vez):
mongosh
2. Crear usuario administrador:
use admin
db.createUser({
user: "admin",
pwd: "contraseña_segura",
roles: ["root"]
})
3. Habilitar autenticación:
sudo nano /etc/mongod.conf
Descomentá o agregá:
security:
authorization: enabled
4. Reiniciar MongoDB:
sudo systemctl restart mongod
Hacer backup y restaurar
Backup:
mongodump --db nombre_base_datos --out /ruta/backup/
Backup con autenticación:
mongodump --db nombre_base_datos -u usuario -p contraseña --authenticationDatabase admin --out /ruta/backup/
Restaurar:
mongorestore --db nombre_base_datos /ruta/backup/nombre_base_datos/
Ventajas y desventajas
Ventajas:
- Flexibilidad en el esquema
- Escalabilidad horizontal fácil
- Rápido para desarrollo
- Buen rendimiento con grandes volúmenes de datos
Desventajas:
- No soporta transacciones complejas (aunque MongoDB 4.0+ las soporta)
- Consume más memoria que bases de datos relacionales
- Curva de aprendizaje si vienes de SQL
¿Cuándo usar MongoDB?
- Aplicaciones con esquemas que cambian frecuentemente
- Contenido generado por usuarios (redes sociales, blogs)
- Catálogos de productos con atributos variables
- Aplicaciones que requieren escalabilidad horizontal
- Datos que no encajan bien en tablas relacionales
¿Necesitás ayuda?
Si tenés dudas sobre MongoDB o necesitás ayuda configurándolo, abrí un ticket desde el panel de billing.baires.host o contactanos por soporte.
También podés escribirnos por nuestras redes:
- Instagram: @baires_host
- Discord (soporte activo): https://discord.gg/dzjauatAFN
- Linktree: https://linktr.ee/baires.host