Skip to content

Referencia DBA MongoDB

Guía de consulta rápida para la materia Gestión de Seguridad y Desempeño de Bases de Datos.

Motor: MongoDB 7 Cliente: mongosh Enfoque: administración, seguridad, control de acceso, diagnóstico, rendimiento, mantenimiento y continuidad.


Este documento reúne comandos básicos para trabajar con MongoDB como administrador de bases de datos.

Incluye:

  • conexión
  • bases de datos
  • colecciones
  • documentos
  • consultas
  • actualización
  • eliminación
  • agregaciones
  • índices
  • análisis de consultas
  • usuarios y roles
  • monitoreo
  • configuración
  • seguridad
  • backup
  • restauración
  • hardening

Terminal window
mongosh

Indicar servidor:

Terminal window
mongosh "mongodb://localhost:27017"

Con autenticación:

Terminal window
mongosh "mongodb://usuario:password@localhost:27017/admin"

Nunca colocar contraseñas reales directamente en comandos, scripts o repositorios.


show dbs
use sistema
db
show collections
help

MongoDB crea una base cuando se almacenan datos en ella.

Seleccionar:

use sistema

Crear implícitamente:

db.usuarios.insertOne({
nombre: "Ana",
correo: "ana@example.com"
})

Eliminar una base:

db.dropDatabase()

Precaución: Esta operación elimina la base actual. Debe utilizarse solamente en ambientes controlados.


db.createCollection("usuarios")
show collections
db.usuarios.drop()

Precaución: Elimina la colección y sus documentos.


db.usuarios.insertOne({
nombre: "Ana López",
correo: "ana@example.com",
activo: true
})
db.usuarios.insertMany([
{
nombre: "Ana",
correo: "ana@example.com",
activo: true
},
{
nombre: "Luis",
correo: "luis@example.com",
activo: true
}
])

db.usuarios.find()
db.usuarios.findOne()
db.usuarios.find({
activo: true
})
db.usuarios.find({
correo: "ana@example.com"
})

Mostrar únicamente algunos campos:

db.usuarios.find(
{ activo: true },
{ nombre: 1, correo: 1 }
)

Excluir un campo:

db.usuarios.find(
{},
{ password: 0 }
)

Esto es especialmente importante cuando existen datos sensibles.


db.usuarios.find({
edad: { $gt: 18 }
})
db.usuarios.find({
edad: { $lt: 18 }
})
db.usuarios.find({
edad: { $gte: 18 }
})
db.usuarios.find({
edad: { $lte: 18 }
})
db.usuarios.find({
estado: { $ne: "inactivo" }
})
db.usuarios.find({
estado: {
$in: ["activo", "pendiente"]
}
})
db.usuarios.find({
activo: true,
edad: { $gte: 18 }
})
db.usuarios.find({
$or: [
{ rol: "admin" },
{ rol: "supervisor" }
]
})

db.usuarios.updateOne(
{ correo: "ana@example.com" },
{
$set: {
activo: false
}
}
)
db.usuarios.updateMany(
{ activo: false },
{
$set: {
estado: "inactivo"
}
}
)
db.productos.updateOne(
{ nombre: "Laptop" },
{
$inc: {
existencia: 1
}
}
)

db.usuarios.deleteOne({
correo: "ana@example.com"
})
db.usuarios.deleteMany({
activo: false
})

Precaución: deleteMany({}) puede eliminar todos los documentos de una colección.

Nunca ejecutar operaciones destructivas sin verificar primero el filtro.


db.usuarios.find().sort({
nombre: 1
})

Descendente:

db.usuarios.find().sort({
nombre: -1
})

db.usuarios.find().limit(10)

db.usuarios.countDocuments()

Con filtro:

db.usuarios.countDocuments({
activo: true
})

MongoDB utiliza el pipeline de agregación para procesar documentos.

Ejemplo:

db.ventas.aggregate([
{
$match: {
estado: "completada"
}
},
{
$group: {
_id: "$cliente",
total: {
$sum: "$importe"
}
}
}
])

Operadores comunes:

$match
$group
$project
$sort
$limit
$lookup
$unwind
$count

db.usuarios.createIndex({
correo: 1
})
db.usuarios.createIndex(
{
correo: 1
},
{
unique: true
}
)
db.usuarios.getIndexes()
db.usuarios.dropIndex("correo_1")

Los índices pueden mejorar las consultas, pero tienen costos de:

  • almacenamiento
  • memoria
  • inserciones
  • actualizaciones
  • mantenimiento

db.usuarios.find({
correo: "ana@example.com"
}).explain("executionStats")

La información permite analizar aspectos como:

  • documentos examinados
  • claves examinadas
  • documentos devueltos
  • uso de índices
  • tiempo de ejecución

Al analizar una consulta es útil observar:

executionTimeMillis
totalDocsExamined
totalKeysExamined
nReturned
winningPlan

Una consulta que devuelve pocos documentos pero examina una gran cantidad puede requerir revisión.


Crear usuario con permisos de lectura:

use sistema
db.createUser({
user: "app_readonly",
pwd: "CAMBIAR_ESTA_CONTRASEÑA",
roles: [
{
role: "read",
db: "sistema"
}
]
})

Usuario de lectura y escritura:

db.createUser({
user: "app_web",
pwd: "CAMBIAR_ESTA_CONTRASEÑA",
roles: [
{
role: "readWrite",
db: "sistema"
}
]
})

La cuenta de aplicación debe tener únicamente los privilegios que realmente necesita.


db.getUsers()

Consultar roles:

db.getRoles()

db.dropUser("app_web")

Verificar dependencias antes de eliminar cuentas.


MongoDB proporciona roles integrados, entre ellos:

read
readWrite
dbAdmin
userAdmin
clusterMonitor

Los roles administrativos deben asignarse solamente cuando sean necesarios.


Ejemplo conceptual:

Aplicación
↓
Usuario app_web
↓
readWrite sobre una base específica
↓
Colecciones necesarias

Evitar:

Aplicación
↓
Usuario administrador
↓
Acceso a todo MongoDB

El segundo modelo aumenta el impacto potencial de:

  • credenciales comprometidas
  • errores de programación
  • inyección NoSQL
  • abuso de privilegios

db.serverStatus()

Puede proporcionar información sobre:

  • conexiones
  • operaciones
  • memoria
  • actividad
  • estadísticas internas

db.stats()

Estadísticas de una colección:

db.usuarios.stats()

Estas herramientas son útiles para diagnóstico y análisis de capacidad.


db.currentOp()

Puede utilizarse para investigar actividad en curso.

El acceso a determinada información depende de los privilegios del usuario y de la configuración del servidor.


Una consideración importante es la dirección en la que MongoDB escucha conexiones.

Ejemplo conceptual:

net:
port: 27017
bindIp: 127.0.0.1

Una configuración que limite las interfaces de escucha reduce la exposición de red.

No debe asumirse que MongoDB debe estar disponible directamente desde Internet.


Una instalación segura debe analizar:

Autenticación
+
Autorización
+
Cifrado
+
Restricción de red

La autenticación verifica:

¿Quién eres?

La autorización determina:

¿Qué puedes hacer?


TLS protege las comunicaciones entre clientes y MongoDB.

Debe considerarse para:

  • aplicaciones
  • administradores
  • réplicas
  • conexiones remotas

La configuración concreta depende de la arquitectura y certificados utilizados.


Ejemplo:

Terminal window
mongodump \
--uri="mongodb://usuario:password@localhost:27017/sistema" \
--out=/backup/sistema

También puede realizarse sobre una instancia completa según la estrategia de respaldo.

No colocar credenciales reales en scripts o repositorios.


Terminal window
mongorestore \
--uri="mongodb://usuario:password@localhost:27017" \
/backup/sistema

Antes de restaurar en producción:

1. Validar respaldo
2. Verificar destino
3. Verificar compatibilidad
4. Restaurar
5. Validar datos
6. Validar aplicación
7. Documentar

32. mongodump no es lo mismo que mongoexport

Section titled “32. mongodump no es lo mismo que mongoexport”

mongodump está orientado al respaldo lógico de MongoDB.

mongoexport está orientado principalmente al intercambio de datos en formatos como JSON o CSV.

No deben considerarse equivalentes.


Ante una consulta lenta:

1. Identificar la consulta
2. Ejecutar explain
3. Revisar documentos examinados
4. Revisar índices
5. Revisar cardinalidad
6. Revisar tamaño de datos
7. Revisar carga del servidor
8. Evaluar el diseño de la consulta

  • Activar autenticación
  • Crear usuarios específicos
  • Evitar cuentas administrativas para aplicaciones
  • Revisar usuarios periódicamente
  • Aplicar mínimo privilegio
  • Revisar roles
  • Eliminar permisos innecesarios
  • Limitar bindIp
  • No exponer MongoDB directamente a Internet
  • Filtrar conexiones mediante firewall
  • Utilizar redes privadas cuando sea posible
  • Utilizar TLS cuando corresponda
  • Proteger credenciales
  • Proteger respaldos
  • Revisar índices
  • Analizar consultas
  • Revisar conexiones
  • Revisar capacidad
  • Revisar registros
  • Realizar backups
  • Proteger backups
  • Probar restauraciones
  • Definir RPO
  • Definir RTO

Especial atención a:

db.dropDatabase()
db.coleccion.drop()
db.coleccion.deleteMany({})
db.coleccion.updateMany(
{},
...
)

También deben revisarse cuidadosamente los cambios de:

roles
usuarios
bindIp
puertos
TLS
firewall
configuración

show dbs
use nombre
show collections
db
db.coleccion.find()
db.coleccion.findOne()
db.coleccion.insertOne()
db.coleccion.insertMany()
db.coleccion.updateOne()
db.coleccion.updateMany()
db.coleccion.deleteOne()
db.coleccion.deleteMany()
db.coleccion.createIndex()
db.coleccion.getIndexes()
db.coleccion.explain()
db.createUser()
db.getUsers()
db.getRoles()
db.dropUser()
db.serverStatus()
db.stats()
db.currentOp()

La administración no consiste en memorizar comandos.

El proceso debe ser:

OBSERVAR
↓
ENTENDER
↓
EVALUAR RIESGO
↓
CAMBIAR
↓
VERIFICAR
↓
DOCUMENTAR

Un DBA debe pensar simultáneamente en:

Datos
Seguridad
Rendimiento
Disponibilidad
Recuperación