W3docs

Eliminare una Collection MongoDB in Python

Scopri come eliminare una collection MongoDB in Python con PyMongo — drop(), drop_collection(), verifica esistenza e pattern di teardown sicuro.

Eliminare una collection MongoDB cancella definitivamente tutti i documenti in essa contenuti e rimuove la collection stessa. L'operazione è immediata e non può essere annullata, quindi vale la pena capire esattamente cosa offre PyMongo, come verificare se una collection esiste prima di agire su di essa e quale metodo scegliere nelle diverse situazioni.

Questo capitolo tratta:

  • I due modi per eliminare una collection — Collection.drop() e Database.drop_collection()
  • Verificare se una collection esiste prima di eliminarla
  • Gestire gli errori in modo appropriato
  • Pattern di teardown sicuro per test e migrazioni

Prerequisiti: Python 3.8+, PyMongo installato (pip install pymongo) e un server MongoDB in esecuzione. Consulta MongoDB Get Started e MongoDB Create Database se hai bisogno di configurare queste componenti prima.

Connessione a MongoDB

Ogni operazione inizia con un MongoClient. Passa la stringa di connessione per il tuo server:

import pymongo

client = pymongo.MongoClient("mongodb://localhost:27017/")
db = client["mydatabase"]

Se il tuo server richiede l'autenticazione, includi le credenziali nell'URI:

client = pymongo.MongoClient("mongodb://username:password@localhost:27017/")

Consulta MongoDB Create Database per una discussione completa delle opzioni di connessione.

Eliminare una Collection con drop()

L'approccio più diretto è chiamare drop() su un oggetto Collection:

import pymongo

client = pymongo.MongoClient("mongodb://localhost:27017/")
db = client["mydatabase"]
col = db["mycollection"]

col.drop()
print("Collection dropped.")

drop() restituisce True se la collection esisteva ed è stata eliminata, oppure False se la collection non esisteva. PyMongo non solleva un errore quando si tenta di eliminare una collection inesistente — restituisce silenziosamente False.

result = col.drop()
print(result)  # True if it existed, False if it was already gone

Eliminare una Collection con drop_collection()

Puoi anche eliminare una collection tramite l'oggetto Database usando drop_collection(). Questo è utile quando hai solo il nome della collection come string e non vuoi costruire prima un oggetto Collection:

import pymongo

client = pymongo.MongoClient("mongodb://localhost:27017/")
db = client["mydatabase"]

db.drop_collection("mycollection")
print("Collection dropped via database method.")

drop_collection() accetta anche un oggetto Collection direttamente, quindi entrambe le seguenti soluzioni sono equivalenti:

# By name (string)
db.drop_collection("mycollection")

# By Collection object
col = db["mycollection"]
db.drop_collection(col)

Quale metodo usare?

SituazioneMetodo consigliato
Hai già un oggetto Collectioncol.drop()
Hai solo il nome della collection come stringdb.drop_collection(name)
Eliminazione all'interno di una sessione o transazionedb.drop_collection(name, session=session)

Verificare se una Collection Esiste Prima di Eliminarla

Poiché drop() riesce silenziosamente su una collection mancante, potresti voler confermare che la collection esista prima di eliminarla — ad esempio, per registrare un avviso o per evitare output fuorviante in uno 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() restituisce una lista di string, una per ogni collection nel database. Il controllo in è un semplice test di appartenenza.

Gestione degli Errori

La maggior parte delle operazioni di eliminazione riesce senza errori, ma due situazioni possono causare fallimenti:

  1. Permessi insufficienti — l'utente connesso non ha il privilegio dropCollection.
  2. Errori di rete — la connessione a MongoDB viene persa durante l'operazione.

PyMongo solleva pymongo.errors.OperationFailure per gli errori lato server (inclusi i problemi di autorizzazione) e pymongo.errors.ConnectionFailure per i problemi di rete. Cattura entrambi:

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}")

Esempio Pratico: Teardown Sicuro nei Test

Un pattern comune nel mondo reale è eliminare una collection alla fine di un test o di una migrazione per lasciare il database pulito. Questo esempio mostra un helper riutilizzabile che elimina una collection solo quando esiste, registra l'esito e non solleva mai un'eccezione che farebbe fallire un test non correlato:

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.

Eliminare una Collection vs. Cancellare Tutti i Documenti

Queste sono due operazioni diverse con risultati diversi:

OperazioneEffetto sulla collectionEffetto sugli indiciVelocità
col.drop()Collection rimossaTutti gli indici rimossiMolto veloce
col.delete_many({})Collection rimane (vuota)Indici conservatiPiù lento su collection di grandi dimensioni

Usa drop() quando vuoi ricominciare completamente da zero — ad esempio, tra un'esecuzione di test e l'altra o come parte di una migrazione dello schema in cui cambierà anche la struttura degli indici. Usa delete_many({}) quando hai bisogno di mantenere intatti gli indici e la configurazione della collection. Consulta MongoDB Delete per i dettagli su delete_many().

  • Collection.drop() elimina la collection e restituisce True/False. Non viene sollevata alcuna eccezione per una collection mancante.
  • Database.drop_collection(name) ottiene lo stesso risultato ed è comodo quando si ha solo il nome della collection come string.
  • Usa db.list_collection_names() per verificare l'esistenza prima di eliminare quando hai bisogno di logica condizionale.
  • Cattura pymongo.errors.OperationFailure per gli errori di autorizzazione e pymongo.errors.ConnectionFailure per i problemi di rete.
  • L'eliminazione rimuove sia i documenti che gli indici. Usa delete_many({}) se vuoi mantenere gli indici.

Capitoli correlati:

Was this page helpful?