Eliminar una colección de MongoDB en Python
Aprende a eliminar una colección de MongoDB en Python con PyMongo: drop(), drop_collection(), verificación de existencia y patrones de desmontaje seguro.
Eliminar una colección de MongoDB borra permanentemente todos los documentos que contiene y elimina la propia colección. La operación es inmediata y no puede revertirse, por lo que vale la pena entender exactamente qué ofrece PyMongo, cómo verificar si una colección existe antes de actuar sobre ella y qué método elegir en distintas situaciones.
Este capítulo cubre:
- Las dos formas de eliminar una colección:
Collection.drop()yDatabase.drop_collection() - Verificar si una colección existe antes de eliminarla
- Manejar errores de forma adecuada
- Patrones de desmontaje seguro para pruebas y migraciones
Requisitos previos: Python 3.8+, PyMongo instalado (
pip install pymongo) y un servidor MongoDB en ejecución. Consulta MongoDB Primeros pasos y MongoDB Crear base de datos si necesitas configurarlos primero.
Conectarse a MongoDB
Cada operación comienza con un MongoClient. Pasa la cadena de conexión de tu servidor:
import pymongo
client = pymongo.MongoClient("mongodb://localhost:27017/")
db = client["mydatabase"]Si tu servidor requiere autenticación, incluye las credenciales en el URI:
client = pymongo.MongoClient("mongodb://username:password@localhost:27017/")Consulta MongoDB Crear base de datos para una discusión completa sobre las opciones de conexión.
Eliminar una colección con drop()
El enfoque más directo es llamar a drop() sobre un objeto Collection:
import pymongo
client = pymongo.MongoClient("mongodb://localhost:27017/")
db = client["mydatabase"]
col = db["mycollection"]
col.drop()
print("Collection dropped.")drop() devuelve True si la colección existía y fue eliminada, o False si la colección no existía. PyMongo no lanza un error cuando intentas eliminar una colección inexistente — simplemente devuelve False en silencio.
result = col.drop()
print(result) # True if it existed, False if it was already goneEliminar una colección con drop_collection()
También puedes eliminar una colección a través del objeto Database usando drop_collection(). Esto resulta útil cuando solo tienes el nombre de la colección como string y no quieres construir primero un objeto Collection:
import pymongo
client = pymongo.MongoClient("mongodb://localhost:27017/")
db = client["mydatabase"]
db.drop_collection("mycollection")
print("Collection dropped via database method.")drop_collection() también acepta un objeto Collection directamente, por lo que las siguientes dos formas son equivalentes:
# By name (string)
db.drop_collection("mycollection")
# By Collection object
col = db["mycollection"]
db.drop_collection(col)¿Qué método debo usar?
| Situación | Método recomendado |
|---|---|
Ya tienes un objeto Collection | col.drop() |
| Solo tienes el nombre de la colección como string | db.drop_collection(name) |
| Eliminar dentro de una sesión o transacción | db.drop_collection(name, session=session) |
Verificar si una colección existe antes de eliminarla
Dado que drop() tiene éxito de forma silenciosa con una colección inexistente, es posible que quieras confirmar que la colección existe antes de eliminarla — por ejemplo, para registrar una advertencia o evitar una salida engañosa en un script:
import pymongo
client = pymongo.MongoClient("mongodb://localhost:27017/")
db = client["mydatabase"]
collection_name = "mycollection"
if collection_name in db.list_collection_names():
db.drop_collection(collection_name)
print(f"'{collection_name}' was dropped.")
else:
print(f"'{collection_name}' does not exist — nothing to drop.")db.list_collection_names() devuelve una lista de strings, uno por cada colección en la base de datos. La comprobación con in es una simple prueba de pertenencia.
Manejo de errores
La mayoría de las operaciones de eliminación se realizan sin errores, pero dos situaciones pueden causar fallos:
- Permisos insuficientes — el usuario conectado no tiene el privilegio
dropCollection. - Errores de red — la conexión a MongoDB se pierde durante la operación.
PyMongo lanza pymongo.errors.OperationFailure para errores del lado del servidor (incluidos los problemas de permisos) y pymongo.errors.ConnectionFailure para problemas de red. Captura ambos:
import pymongo
client = pymongo.MongoClient("mongodb://localhost:27017/")
db = client["mydatabase"]
col = db["mycollection"]
try:
col.drop()
print("Collection dropped successfully.")
except pymongo.errors.OperationFailure as e:
print(f"Server error while dropping collection: {e}")
except pymongo.errors.ConnectionFailure as e:
print(f"Connection error: {e}")Ejemplo práctico: desmontaje seguro en pruebas
Un patrón común en la práctica es eliminar una colección al final de una prueba o migración para dejar la base de datos limpia. Este ejemplo muestra un helper reutilizable que elimina una colección solo cuando existe, registra el resultado y nunca lanza una excepción que pueda hacer fallar una prueba no relacionada:
import pymongo
def drop_if_exists(db, collection_name: str) -> bool:
"""
Drop a collection if it exists. Returns True if dropped, False otherwise.
Never raises on a missing collection.
"""
if collection_name not in db.list_collection_names():
print(f"[skip] '{collection_name}' does not exist.")
return False
try:
db.drop_collection(collection_name)
print(f"[ok] '{collection_name}' dropped.")
return True
except pymongo.errors.OperationFailure as e:
print(f"[err] Could not drop '{collection_name}': {e}")
return False
# --- usage ---
client = pymongo.MongoClient("mongodb://localhost:27017/")
db = client["testdb"]
# Seed some data so the collection exists
db["orders"].insert_one({"item": "pen", "qty": 100})
drop_if_exists(db, "orders") # [ok] 'orders' dropped.
drop_if_exists(db, "orders") # [skip] 'orders' does not exist.Eliminar una colección vs. borrar todos los documentos
Estas son dos operaciones distintas con resultados diferentes:
| Operación | Efecto sobre la colección | Efecto sobre los índices | Velocidad |
|---|---|---|---|
col.drop() | Colección eliminada | Todos los índices eliminados | Muy rápida |
col.delete_many({}) | Colección permanece (vacía) | Índices conservados | Más lenta en colecciones grandes |
Usa drop() cuando quieras empezar completamente desde cero — por ejemplo, entre ejecuciones de pruebas o como parte de una migración de esquema donde también cambiará la disposición de índices. Usa delete_many({}) cuando necesites mantener los índices y la configuración de la colección intactos. Consulta MongoDB Delete para los detalles de delete_many().
Resumen
Collection.drop()elimina la colección y devuelveTrue/False. No se lanza ninguna excepción si la colección no existe.Database.drop_collection(name)logra el mismo resultado y es conveniente cuando solo tienes el nombre de la colección como string.- Usa
db.list_collection_names()para verificar la existencia antes de eliminar cuando necesites lógica condicional. - Captura
pymongo.errors.OperationFailurepara errores de permisos ypymongo.errors.ConnectionFailurepara problemas de red. - Eliminar una colección borra tanto los documentos como los índices. Usa
delete_many({})en su lugar si quieres conservar los índices.
Capítulos relacionados:
- MongoDB Crear colección — crear colecciones con opciones y validadores
- MongoDB Delete — eliminar documentos individuales con
delete_one()ydelete_many() - MongoDB Primeros pasos — instalar PyMongo y conectarse a MongoDB