Hoja de Trucos de MongoDB

Aprenda MongoDB con Laboratorios Prácticos

Aprenda la gestión de bases de datos NoSQL de MongoDB a través de laboratorios prácticos y escenarios del mundo real. LabEx ofrece cursos completos de MongoDB que cubren operaciones esenciales, consultas de documentos, pipelines de agregación, estrategias de indexación y técnicas avanzadas. Domine el modelo de datos basado en documentos de MongoDB para construir aplicaciones de bases de datos escalables y flexibles.

Gestión de Bases de Datos y Colecciones

Mostrar Bases de Datos: show dbs

Muestra todas las bases de datos en el servidor MongoDB.

// Mostrar todas las bases de datos
show dbs
// Mostrar la base de datos actual
db
// Obtener estadísticas de la base de datos
db.stats()
// Obtener ayuda de la base de datos
db.help()

Usar Base de Datos: use database_name

Cambia a una base de datos específica (se crea si no existe).

// Cambiar a la base de datos myapp
use myapp
// Crear base de datos insertando datos
use newdb
db.users.insertOne({name: "John"})
Quiz

Inicia sesión para responder este quiz y rastrear tu progreso de aprendizaje

¿Qué sucede cuando ejecutas use newdb en MongoDB?
Crea la base de datos inmediatamente
Cambia a la base de datos (la crea cuando insertas datos por primera vez)
Elimina la base de datos
Muestra todas las colecciones en la base de datos

Eliminar Base de Datos: db.dropDatabase()

Elimina la base de datos actual y todas sus colecciones.

// Eliminar la base de datos actual
db.dropDatabase()
// Confirmar con el nombre de la base de datos
use myapp
db.dropDatabase()

Mostrar Colecciones: show collections

Lista todas las colecciones en la base de datos actual.

// Mostrar todas las colecciones
show collections
// Método alternativo
db.runCommand("listCollections")

Crear Colección: db.createCollection()

Crea una nueva colección con configuración opcional.

// Crear colección simple
db.createCollection('users')
// Crear con opciones
db.createCollection('logs', {
  capped: true,
  size: 1000000,
  max: 1000,
})

Eliminar Colección: db.collection.drop()

Elimina una colección y todos sus documentos.

// Eliminar colección users
db.users.drop()
// Verificar si la colección fue eliminada
show collections

Estructura e Información del Documento

Estadísticas de Colección: db.collection.stats()

Muestra estadísticas completas sobre una colección, incluyendo tamaño, recuento de documentos e información de índices.

// Estadísticas de la colección
db.users.stats()
// Contar documentos
db.users.countDocuments()
// Conteo estimado (más rápido)
db.users.estimatedDocumentCount()
// Verificar índices de la colección
db.users.getIndexes()

Documentos de Muestra: db.collection.findOne()

Recupera documentos de muestra para comprender la estructura y los tipos de datos.

// Obtener un documento
db.users.findOne()
// Obtener documento específico
db.users.findOne({ name: 'John' })
// Obtener documento mostrando todos los campos
db.users.findOne({}, { _id: 0 })

Explorar Datos: db.collection.find().limit()

Navega por los datos de la colección con paginación y formato.

// Primeros 5 documentos
db.users.find().limit(5)
// Omitir y limitar (paginación)
db.users.find().skip(10).limit(5)
// Formato bonito
db.users.find().pretty()

Inserción de Documentos (Crear)

Insertar Uno: db.collection.insertOne()

Añade un único documento a una colección.

// Insertar documento único
db.users.insertOne({
  name: 'John Doe',
  age: 30,
  email: 'john@example.com',
})
// Insertar con _id personalizado
db.users.insertOne({
  _id: 'custom_id_123',
  name: 'Jane Doe',
  status: 'active',
})
Quiz

Inicia sesión para responder este quiz y rastrear tu progreso de aprendizaje

¿Qué devuelve db.users.insertOne()?
Un objeto de acuse de recibo con el _id del documento insertado
El documento insertado
Nada
El número de documentos insertados

Insertar Varios: db.collection.insertMany()

Añade múltiples documentos en una sola operación.

// Insertar múltiples documentos
db.users.insertMany([
  { name: 'Alice', age: 25 },
  { name: 'Bob', age: 35 },
  { name: 'Charlie', age: 28 },
])
// Insertar con opciones
db.users.insertMany(
  [
    { name: 'Dave', age: 40 },
    { name: 'Eve', age: 22 },
  ],
  { ordered: false },
)

Insertar con Fecha: new Date()

Añade documentos con campos de marca de tiempo.

// Insertar con fecha actual
db.posts.insertOne({
  title: 'Mi Publicación de Blog',
  content: 'Contenido de la publicación aquí',
  createdAt: new Date(),
  publishDate: ISODate('2024-01-15'),
})

Insertar Documentos Anidados

Añade documentos con objetos y arrays incrustados.

// Insertar con objetos anidados
db.users.insertOne({
  name: 'John Doe',
  address: {
    street: '123 Main St',
    city: 'New York',
    zip: '10001',
  },
  hobbies: ['reading', 'swimming', 'coding'],
})

Consulta de Documentos (Leer)

Búsqueda Básica: db.collection.find()

Recupera documentos basados en condiciones de consulta.

// Encontrar todos los documentos
db.users.find()
// Encontrar con condición
db.users.find({ age: 30 })
// Encontrar con múltiples condiciones (AND)
db.users.find({ age: 30, status: 'active' })
// Encontrar con condición OR
db.users.find({ $or: [{ age: 25 }, { age: 30 }] })

Proyección: db.collection.find({}, {})

Controla qué campos se devuelven en los resultados.

// Incluir campos específicos
db.users.find({}, { name: 1, age: 1 })
// Excluir campos específicos
db.users.find({}, { password: 0, _id: 0 })
// Proyección de campo anidado
db.users.find({}, { 'address.city': 1 })

Operadores de Consulta: $gt, $lt, $in, etc.

Utiliza operadores de comparación y lógicos para consultas complejas.

// Mayor que, menor que
db.users.find({ age: { $gt: 25, $lt: 40 } })
// En array
db.users.find({ status: { $in: ['active', 'pending'] } })
// No igual
db.users.find({ status: { $ne: 'inactive' } })
// Existe
db.users.find({ email: { $exists: true } })
Quiz

Inicia sesión para responder este quiz y rastrear tu progreso de aprendizaje

¿Qué significa $gt en las consultas de MongoDB?
Mayor o igual que
Mayor que
Agrupar por
Obtener total

Búsqueda de Texto: $text, $regex

Busca documentos usando texto y coincidencia de patrones.

// Búsqueda de texto (requiere índice de texto)
db.posts.find({ $text: { $search: 'mongodb tutorial' } })
// Búsqueda Regex
db.users.find({ name: { $regex: '^John', $options: 'i' } })
// Búsqueda insensible a mayúsculas y minúsculas
db.users.find({ email: { $regex: '@gmail.com$' } })

Actualizaciones de Documentos

Actualizar Uno: db.collection.updateOne()

Modifica el primer documento que coincide con la consulta.

// Actualizar campo único
db.users.updateOne({ name: 'John Doe' }, { $set: { age: 31 } })
// Actualizar múltiples campos
db.users.updateOne(
  { _id: ObjectId('...') },
  { $set: { age: 31, status: 'updated' } },
)
// Upsert (insertar si no se encuentra)
db.users.updateOne(
  { name: 'New User' },
  { $set: { age: 25 } },
  { upsert: true },
)

Actualizar Varios: db.collection.updateMany()

Modifica todos los documentos que coinciden con la condición de consulta.

// Actualizar múltiples documentos
db.users.updateMany({ status: 'inactive' }, { $set: { status: 'archived' } })
// Incrementar valores
db.posts.updateMany({ category: 'tech' }, { $inc: { views: 1 } })

Operadores de Actualización: $set, $unset, $push

Utiliza varios operadores para modificar campos de documentos.

// Establecer y anular campos
db.users.updateOne(
  { name: 'John' },
  { $set: { lastLogin: new Date() }, $unset: { temp: '' } },
)
// Añadir a array
db.users.updateOne({ name: 'John' }, { $push: { hobbies: 'gaming' } })
Quiz

Inicia sesión para responder este quiz y rastrear tu progreso de aprendizaje

¿Qué hace $set en las operaciones de actualización de MongoDB?
Elimina un campo
Añade un elemento a un array
Establece el valor de un campo
Elimina un elemento de un array
// Extraer de array
db.users.updateOne({ name: 'John' }, { $pull: { hobbies: 'reading' } })

Reemplazar Documento: db.collection.replaceOne()

Reemplaza un documento completo excepto el campo _id.

// Reemplazar documento completo
db.users.replaceOne(
  { name: 'John Doe' },
  {
    name: 'John Smith',
    age: 35,
    email: 'johnsmith@example.com',
  },
)

Agregación de Datos

Agregación Básica: db.collection.aggregate()

Procesa datos a través de etapas del pipeline de agregación.

// Agrupar y contar
db.users.aggregate([{ $group: { _id: '$status', count: { $sum: 1 } } }])
// Coincidir y agrupar
db.orders.aggregate([
  { $match: { status: 'completed' } },
  { $group: { _id: '$customerId', total: { $sum: '$amount' } } },
])

Etapas Comunes: $match, $group, $sort

Utiliza etapas del pipeline para transformar y analizar datos.

// Pipeline de agregación complejo
db.sales.aggregate([
  { $match: { date: { $gte: ISODate('2024-01-01') } } },
  {
    $group: {
      _id: '$product',
      totalSales: { $sum: '$amount' },
      avgPrice: { $avg: '$price' },
    },
  },
  { $sort: { totalSales: -1 } },
  { $limit: 10 },
])

Operadores de Agregación: $sum, $avg, $max

Calcula valores estadísticos y realiza operaciones matemáticas.

// Operaciones estadísticas
db.products.aggregate([
  {
    $group: {
      _id: '$category',
      maxPrice: { $max: '$price' },
      minPrice: { $min: '$price' },
      avgPrice: { $avg: '$price' },
      count: { $sum: 1 },
    },
  },
])

Etapa de Proyección: $project

Transforma la estructura del documento y crea campos calculados.

// Proyectar y calcular campos
db.users.aggregate([
  {
    $project: {
      name: 1,
      age: 1,
      isAdult: { $gte: ['$age', 18] },
      fullName: { $concat: ['$firstName', ' ', '$lastName'] },
    },
  },
])

Eliminación de Documentos

Eliminar Uno: db.collection.deleteOne()

Elimina el primer documento que coincide con la condición de consulta.

// Eliminar documento único
db.users.deleteOne({ name: 'John Doe' })
// Eliminar por ID
db.users.deleteOne({ _id: ObjectId('...') })
// Eliminar con condición
db.posts.deleteOne({ status: 'draft', author: 'unknown' })

Eliminar Varios: db.collection.deleteMany()

Elimina todos los documentos que coinciden con la condición de consulta.

// Eliminar múltiples documentos
db.users.deleteMany({ status: 'inactive' })
// Eliminar todos los documentos (¡cuidado!)
db.temp_collection.deleteMany({})
// Eliminar con condición de fecha
db.logs.deleteMany({
  createdAt: { $lt: new Date('2024-01-01') },
})

Encontrar y Eliminar: db.collection.findOneAndDelete()

Encuentra un documento y lo elimina en una sola operación atómica.

// Encontrar y eliminar
const deletedDoc = db.users.findOneAndDelete({ status: 'pending' })
// Encontrar y eliminar con opciones
db.queue.findOneAndDelete({ processed: false }, { sort: { priority: -1 } })

Indexación y Rendimiento

Crear Índice: db.collection.createIndex()

Crea índices en campos para acelerar las consultas.

// Índice de campo único
db.users.createIndex({ email: 1 })
// Índice compuesto
db.users.createIndex({ status: 1, createdAt: -1 })
// Índice de texto para búsqueda
db.posts.createIndex({ title: 'text', content: 'text' })
// Índice único
db.users.createIndex({ email: 1 }, { unique: true })

Gestión de Índices: getIndexes(), dropIndex()

Ver y gestionar índices existentes en colecciones.

// Listar todos los índices
db.users.getIndexes()
// Eliminar índice específico
db.users.dropIndex({ email: 1 })
// Eliminar índice por nombre
db.users.dropIndex('email_1')
// Eliminar todos los índices excepto _id
db.users.dropIndexes()

Rendimiento de Consultas: explain()

Analiza la ejecución de consultas y las estadísticas de rendimiento.

// Explicar ejecución de consulta
db.users.find({ age: { $gt: 25 } }).explain('executionStats')
// Verificar si se utiliza un índice
db.users.find({ email: 'john@example.com' }).explain()
// Analizar rendimiento de agregación
db.users
  .aggregate([
    { $match: { status: 'active' } },
    { $group: { _id: '$department', count: { $sum: 1 } } },
  ])
  .explain('executionStats')

Consejos de Rendimiento

Prácticas recomendadas para optimizar consultas y operaciones de MongoDB.

// Usar proyección para limitar la transferencia de datos
db.users.find({ status: 'active' }, { name: 1, email: 1 })
// Limitar resultados para un mejor rendimiento
db.posts.find().sort({ createdAt: -1 }).limit(10)
// Usar hint para forzar un índice específico
db.users.find({ age: 25 }).hint({ age: 1 })

Shell de MongoDB y Conexión

Conectarse a MongoDB: mongosh

Inicia el shell de MongoDB y conéctate a diferentes instancias.

# Conectarse a MongoDB local
mongosh
# Conectarse a host y puerto específicos
mongosh "mongodb://localhost:27017"
# Conectarse a servidor remoto
mongosh "mongodb://username:password@host:port/database"
# Conectarse con opciones
mongosh --host localhost --port 27017

Ayudas del Shell: help, exit

Obtén información de ayuda y gestiona sesiones del shell.

// Ayuda general
help
// Ayuda específica de la base de datos
db.help()
// Ayuda específica de la colección
db.users.help()
// Salir del shell
exit

Variables y Configuración del Shell

Configura el comportamiento del shell y utiliza variables de JavaScript.

// Establecer variable
var myQuery = { status: 'active' }
db.users.find(myQuery)
// Configurar opciones de visualización
db.users.find().pretty()
// Mostrar tiempo de ejecución
db.users.find({ age: 25 }).explain('executionStats')
// Usar JavaScript en el shell
var user = db.users.findOne({ name: 'John' })
print('User age: ' + user.age)

Importación y Exportación de Datos

Importar Datos: mongoimport

Carga datos desde archivos JSON, CSV o TSV a MongoDB.

# Importar archivo JSON
mongoimport --db myapp --collection users --file users.json
# Importar archivo CSV
mongoimport --db myapp --collection products \
  --type csv --headerline --file products.csv
# Importar con upsert
mongoimport --db myapp --collection users \
  --file users.json --mode upsert

Exportar Datos: mongoexport

Exporta datos de MongoDB a formato JSON o CSV.

# Exportar a JSON
mongoexport --db myapp --collection users \
  --out users.json
# Exportar a CSV
mongoexport --db myapp --collection users \
  --type csv --fields name,email,age --out users.csv
# Exportar con consulta
mongoexport --db myapp --collection users \
  --query '{"status":"active"}' --out active_users.json

Copia de Seguridad: mongodump

Crea copias de seguridad binarias de bases de datos MongoDB.

# Copia de seguridad de toda la base de datos
mongodump --db myapp --out /backup/
# Copia de seguridad de colección específica
mongodump --db myapp --collection users --out /backup/
# Copia de seguridad con compresión
mongodump --db myapp --gzip --out /backup/

Restauración: mongorestore

Restaura datos de MongoDB desde copias de seguridad binarias.

# Restaurar base de datos
mongorestore --db myapp /backup/myapp/
# Restaurar con eliminación previa
mongorestore --db myapp --drop /backup/myapp/
# Restaurar copia de seguridad comprimida
mongorestore --gzip --db myapp /backup/myapp/

Instalación y Configuración de MongoDB

Servidor Comunitario de MongoDB

Descarga e instala MongoDB Community Edition.

# Ubuntu/Debian
sudo apt-get install -y mongodb-org
# Iniciar servicio MongoDB
sudo systemctl start mongod
# Habilitar autoarranque
sudo systemctl enable mongod
# Verificar estado
sudo systemctl status mongod

Instalación con Docker

Ejecuta MongoDB usando contenedores Docker.

# Descargar imagen de MongoDB
docker pull mongo
# Ejecutar contenedor MongoDB
docker run --name mongodb -d \
  -p 27017:27017 \
  -v mongodb_data:/data/db \
  mongo
# Conectarse al contenedor
docker exec -it mongodb mongosh

MongoDB Compass (GUI)

Instala y utiliza la herramienta GUI oficial de MongoDB.

# Descargar desde mongodb.com
# Conectar usando cadena de conexión
mongodb://localhost:27017
# Características disponibles:
# - Constructor visual de consultas
# - Análisis de esquemas
# - Monitoreo de rendimiento
# - Gestión de índices

Configuración y Seguridad

Autenticación: Crear Usuarios

Configura usuarios de base de datos con roles y permisos adecuados.

// Crear usuario administrador
use admin
db.createUser({
  user: "admin",
  pwd: "securepassword",
  roles: [{role: "root", db: "admin"}]
})
// Crear usuario de base de datos
use myapp
db.createUser({
  user: "appuser",
  pwd: "password123",
  roles: [{role: "readWrite", db: "myapp"}]
})

Habilitar Autenticación

Configura MongoDB para requerir autenticación.

# Editar /etc/mongod.conf
security:
  authorization: enabled
# Reiniciar MongoDB
sudo systemctl restart mongod
# Conectarse con autenticación
mongosh -u admin -p --authenticationDatabase admin

Conjuntos de Réplicas: rs.initiate()

Configura conjuntos de réplicas para alta disponibilidad.

// Inicializar conjunto de réplicas
rs.initiate({
  _id: 'myReplicaSet',
  members: [
    { _id: 0, host: 'mongodb1:27017' },
    { _id: 1, host: 'mongodb2:27017' },
    { _id: 2, host: 'mongodb3:27017' },
  ],
})
// Verificar estado del conjunto de réplicas
rs.status()

Opciones de Configuración

Configuraciones comunes de MongoDB.

# Ejemplo de mongod.conf
storage:
  dbPath: /var/lib/mongodb
systemLog:
  destination: file
  path: /var/log/mongodb/mongod.log
net:
  port: 27017
  bindIp: 127.0.0.1
processManagement:
  fork: true

Manejo de Errores y Depuración

Errores Comunes y Soluciones

Identifica y soluciona problemas frecuentes de MongoDB.

// Errores de conexión
// Verificar si MongoDB se está ejecutando
sudo systemctl status mongod
// Verificar disponibilidad del puerto
netstat -tuln | grep 27017
// Manejo de error de clave duplicada
try {
  db.users.insertOne({email: "existing@example.com"})
} catch (e) {
  if (e.code === 11000) {
    print("Email already exists")
  }
}

Monitoreo: db.currentOp(), db.serverStatus()

Monitorea operaciones de base de datos y rendimiento del servidor.

// Revisar operaciones actuales
db.currentOp()
// Matar operación de larga duración
db.killOp(operationId)
// Estado del servidor
db.serverStatus()
// Estadísticas de conexión
db.runCommand({ connPoolStats: 1 })

Perfilado: db.setProfilingLevel()

Habilita el perfilado para analizar operaciones lentas.

// Habilitar perfilado para operaciones lentas (>100ms)
db.setProfilingLevel(1, { slowms: 100 })
// Habilitar perfilado para todas las operaciones
db.setProfilingLevel(2)
// Ver datos del perfilador
db.system.profile.find().sort({ ts: -1 }).limit(5)
// Deshabilitar perfilado
db.setProfilingLevel(0)

Operaciones Avanzadas

Transacciones: session.startTransaction()

Utiliza transacciones de múltiples documentos para la consistencia de los datos.

// Iniciar sesión y transacción
const session = db.getMongo().startSession()
session.startTransaction()
try {
  const users = session.getDatabase('myapp').users
  const accounts = session.getDatabase('myapp').accounts

  users.insertOne({ name: 'John', balance: 100 })
  accounts.updateOne({ userId: 'john' }, { $inc: { balance: -100 } })

  session.commitTransaction()
} catch (error) {
  session.abortTransaction()
} finally {
  session.endSession()
}

Flujos de Cambio: db.collection.watch()

Observa cambios en tiempo real en las colecciones.

// Observar cambios en la colección
const changeStream = db.users.watch()
changeStream.on('change', (change) => {
  console.log('Change detected:', change)
})
// Observar con filtro
const pipeline = [{ $match: { operationType: 'insert' } }]
const changeStream = db.users.watch(pipeline)

Enlaces Relevantes