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.
1. Propósito
Section titled “1. Propósito”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
2. Conectarse
Section titled “2. Conectarse”Conexión local
Section titled “Conexión local”mongoshIndicar servidor:
mongosh "mongodb://localhost:27017"Con autenticación:
mongosh "mongodb://usuario:password@localhost:27017/admin"Nunca colocar contraseñas reales directamente en comandos, scripts o repositorios.
3. Comandos básicos de mongosh
Section titled “3. Comandos básicos de mongosh”Mostrar bases de datos
Section titled “Mostrar bases de datos”show dbsSeleccionar base
Section titled “Seleccionar base”use sistemaMostrar base actual
Section titled “Mostrar base actual”dbMostrar colecciones
Section titled “Mostrar colecciones”show collectionsObtener ayuda
Section titled “Obtener ayuda”help4. Bases de datos
Section titled “4. Bases de datos”MongoDB crea una base cuando se almacenan datos en ella.
Seleccionar:
use sistemaCrear 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.
5. Colecciones
Section titled “5. Colecciones”Crear colección
Section titled “Crear colección”db.createCollection("usuarios")Listar colecciones
Section titled “Listar colecciones”show collectionsEliminar colección
Section titled “Eliminar colección”db.usuarios.drop()Precaución: Elimina la colección y sus documentos.
6. Insertar documentos
Section titled “6. Insertar documentos”Un documento
Section titled “Un documento”db.usuarios.insertOne({ nombre: "Ana López", correo: "ana@example.com", activo: true})Varios documentos
Section titled “Varios documentos”db.usuarios.insertMany([ { nombre: "Ana", correo: "ana@example.com", activo: true }, { nombre: "Luis", correo: "luis@example.com", activo: true }])7. Consultar documentos
Section titled “7. Consultar documentos”db.usuarios.find()Primer documento
Section titled “Primer documento”db.usuarios.findOne()Filtro
Section titled “Filtro”db.usuarios.find({ activo: true})Por correo
Section titled “Por correo”db.usuarios.find({ correo: "ana@example.com"})8. Proyección
Section titled “8. Proyección”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.
9. Operadores de consulta
Section titled “9. Operadores de consulta”Mayor que
Section titled “Mayor que”db.usuarios.find({ edad: { $gt: 18 }})Menor que
Section titled “Menor que”db.usuarios.find({ edad: { $lt: 18 }})Mayor o igual
Section titled “Mayor o igual”db.usuarios.find({ edad: { $gte: 18 }})Menor o igual
Section titled “Menor o igual”db.usuarios.find({ edad: { $lte: 18 }})Diferente
Section titled “Diferente”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" } ]})10. Actualizar documentos
Section titled “10. Actualizar documentos”Actualizar uno
Section titled “Actualizar uno”db.usuarios.updateOne( { correo: "ana@example.com" }, { $set: { activo: false } })Actualizar varios
Section titled “Actualizar varios”db.usuarios.updateMany( { activo: false }, { $set: { estado: "inactivo" } })Incrementar
Section titled “Incrementar”db.productos.updateOne( { nombre: "Laptop" }, { $inc: { existencia: 1 } })11. Eliminar documentos
Section titled “11. Eliminar documentos”db.usuarios.deleteOne({ correo: "ana@example.com"})Varios
Section titled “Varios”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.
12. Ordenamiento
Section titled “12. Ordenamiento”db.usuarios.find().sort({ nombre: 1})Descendente:
db.usuarios.find().sort({ nombre: -1})13. Limitar resultados
Section titled “13. Limitar resultados”db.usuarios.find().limit(10)14. Contar documentos
Section titled “14. Contar documentos”db.usuarios.countDocuments()Con filtro:
db.usuarios.countDocuments({ activo: true})15. Agregaciones
Section titled “15. Agregaciones”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$count16. Índices
Section titled “16. Índices”Crear índice
Section titled “Crear índice”db.usuarios.createIndex({ correo: 1})Índice único
Section titled “Índice único”db.usuarios.createIndex( { correo: 1 }, { unique: true })Listar índices
Section titled “Listar índices”db.usuarios.getIndexes()Eliminar índice
Section titled “Eliminar índice”db.usuarios.dropIndex("correo_1")Los índices pueden mejorar las consultas, pero tienen costos de:
- almacenamiento
- memoria
- inserciones
- actualizaciones
- mantenimiento
17. Analizar una consulta
Section titled “17. Analizar una consulta”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
18. Conceptos importantes del explain
Section titled “18. Conceptos importantes del explain”Al analizar una consulta es útil observar:
executionTimeMillistotalDocsExaminedtotalKeysExaminednReturnedwinningPlanUna consulta que devuelve pocos documentos pero examina una gran cantidad puede requerir revisión.
19. Usuarios
Section titled “19. Usuarios”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.
20. Consultar usuarios
Section titled “20. Consultar usuarios”db.getUsers()Consultar roles:
db.getRoles()21. Eliminar usuario
Section titled “21. Eliminar usuario”db.dropUser("app_web")Verificar dependencias antes de eliminar cuentas.
22. Roles
Section titled “22. Roles”MongoDB proporciona roles integrados, entre ellos:
readreadWritedbAdminuserAdminclusterMonitorLos roles administrativos deben asignarse solamente cuando sean necesarios.
23. Mínimo privilegio
Section titled “23. Mínimo privilegio”Ejemplo conceptual:
Aplicación ↓Usuario app_web ↓readWrite sobre una base específica ↓Colecciones necesariasEvitar:
Aplicación ↓Usuario administrador ↓Acceso a todo MongoDBEl segundo modelo aumenta el impacto potencial de:
- credenciales comprometidas
- errores de programación
- inyección NoSQL
- abuso de privilegios
24. Información del servidor
Section titled “24. Información del servidor”db.serverStatus()Puede proporcionar información sobre:
- conexiones
- operaciones
- memoria
- actividad
- estadísticas internas
25. Estadísticas de una base
Section titled “25. Estadísticas de una base”db.stats()Estadísticas de una colección:
db.usuarios.stats()Estas herramientas son útiles para diagnóstico y análisis de capacidad.
26. Operaciones actuales
Section titled “26. Operaciones actuales”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.
27. Configuración de red
Section titled “27. Configuración de red”Una consideración importante es la dirección en la que MongoDB escucha conexiones.
Ejemplo conceptual:
net: port: 27017 bindIp: 127.0.0.1Una 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.
28. Autenticación
Section titled “28. Autenticación”Una instalación segura debe analizar:
Autenticación+Autorización+Cifrado+Restricción de redLa autenticación verifica:
¿Quién eres?
La autorización determina:
¿Qué puedes hacer?
29. TLS
Section titled “29. TLS”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.
30. Backup con mongodump
Section titled “30. Backup con mongodump”Ejemplo:
mongodump \ --uri="mongodb://usuario:password@localhost:27017/sistema" \ --out=/backup/sistemaTambién puede realizarse sobre una instancia completa según la estrategia de respaldo.
No colocar credenciales reales en scripts o repositorios.
31. Restauración con mongorestore
Section titled “31. Restauración con mongorestore”mongorestore \ --uri="mongodb://usuario:password@localhost:27017" \ /backup/sistemaAntes de restaurar en producción:
1. Validar respaldo2. Verificar destino3. Verificar compatibilidad4. Restaurar5. Validar datos6. Validar aplicación7. Documentar32. 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.
33. Diagnóstico básico
Section titled “33. Diagnóstico básico”Ante una consulta lenta:
1. Identificar la consulta2. Ejecutar explain3. Revisar documentos examinados4. Revisar índices5. Revisar cardinalidad6. Revisar tamaño de datos7. Revisar carga del servidor8. Evaluar el diseño de la consulta34. Checklist de seguridad MongoDB
Section titled “34. Checklist de seguridad MongoDB”Autenticación
Section titled “Autenticación”- Activar autenticación
- Crear usuarios específicos
- Evitar cuentas administrativas para aplicaciones
- Revisar usuarios periódicamente
Autorización
Section titled “Autorización”- 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
Cifrado
Section titled “Cifrado”- Utilizar TLS cuando corresponda
- Proteger credenciales
- Proteger respaldos
Mantenimiento
Section titled “Mantenimiento”- Revisar índices
- Analizar consultas
- Revisar conexiones
- Revisar capacidad
- Revisar registros
Continuidad
Section titled “Continuidad”- Realizar backups
- Proteger backups
- Probar restauraciones
- Definir RPO
- Definir RTO
35. Operaciones peligrosas
Section titled “35. Operaciones peligrosas”Especial atención a:
db.dropDatabase()db.coleccion.drop()db.coleccion.deleteMany({})db.coleccion.updateMany( {}, ...)También deben revisarse cuidadosamente los cambios de:
rolesusuariosbindIppuertosTLSfirewallconfiguración36. Comandos que conviene memorizar
Section titled “36. Comandos que conviene memorizar”show dbsuse nombreshow collectionsdbdb.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()37. Modelo mental del DBA MongoDB
Section titled “37. Modelo mental del DBA MongoDB”La administración no consiste en memorizar comandos.
El proceso debe ser:
OBSERVAR ↓ENTENDER ↓EVALUAR RIESGO ↓CAMBIAR ↓VERIFICAR ↓DOCUMENTARUn DBA debe pensar simultáneamente en:
DatosSeguridadRendimientoDisponibilidadRecuperación
