W3docs

MongoDB Collection löschen in Python

MongoDB-Collection in Python mit PyMongo löschen — drop(), drop_collection(), Existenzprüfung und sichere Teardown-Muster.

Das Löschen einer MongoDB-Collection entfernt dauerhaft alle darin enthaltenen Dokumente und die Collection selbst. Die Operation ist sofortig und kann nicht rückgängig gemacht werden. Daher lohnt es sich zu verstehen, was PyMongo bietet, wie man prüft, ob eine Collection vor dem Zugriff darauf existiert, und welche Methode in verschiedenen Situationen zu wählen ist.

Dieses Kapitel behandelt:

  • Die zwei Möglichkeiten, eine Collection zu löschen — Collection.drop() und Database.drop_collection()
  • Prüfen, ob eine Collection existiert, bevor sie gelöscht wird
  • Fehlerbehandlung
  • Sichere Teardown-Muster für Tests und Migrationen

Voraussetzungen: Python 3.8+, PyMongo installiert (pip install pymongo) und ein laufender MongoDB-Server. Siehe MongoDB Get Started und MongoDB Create Database, falls Sie diese erst einrichten müssen.

Verbindung zu MongoDB herstellen

Jede Operation beginnt mit einem MongoClient. Übergeben Sie den Verbindungsstring für Ihren Server:

import pymongo

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

Wenn Ihr Server Authentifizierung erfordert, fügen Sie die Anmeldedaten in den URI ein:

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

Siehe MongoDB Create Database für eine ausführliche Diskussion der Verbindungsoptionen.

Eine Collection mit drop() löschen

Der direkteste Ansatz ist, drop() auf einem Collection-Objekt aufzurufen:

import pymongo

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

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

drop() gibt True zurück, wenn die Collection existierte und gelöscht wurde, oder False, wenn die Collection nicht existierte. PyMongo löst keinen Fehler aus, wenn Sie versuchen, eine nicht vorhandene Collection zu löschen — es gibt stillschweigend False zurück.

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

Eine Collection mit drop_collection() löschen

Sie können eine Collection auch über das Database-Objekt mit drop_collection() löschen. Dies ist nützlich, wenn Sie nur den Collection-Namen als string haben und kein Collection-Objekt erstellen möchten:

import pymongo

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

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

drop_collection() akzeptiert auch direkt ein Collection-Objekt, daher sind beide der folgenden Varianten gleichwertig:

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

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

Welche Methode soll ich verwenden?

SituationEmpfohlene Methode
Sie haben bereits ein Collection-Objektcol.drop()
Sie haben nur den Collection-Namen als stringdb.drop_collection(name)
Löschen innerhalb einer Session oder Transaktiondb.drop_collection(name, session=session)

Vorab prüfen, ob eine Collection existiert

Da drop() bei einer fehlenden Collection stillschweigend erfolgreich ist, möchten Sie möglicherweise bestätigen, dass die Collection existiert, bevor Sie sie löschen — zum Beispiel um eine Warnung zu protokollieren oder irreführende Ausgaben in einem Skript zu vermeiden:

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() gibt eine Liste von strings zurück, einen pro Collection in der Datenbank. Die in-Prüfung ist ein einfacher Mitgliedschaftstest.

Fehlerbehandlung

Die meisten Löschoperationen gelingen ohne Fehler, aber zwei Situationen können zu Fehlern führen:

  1. Unzureichende Berechtigungen — der verbundene Benutzer hat nicht das dropCollection-Privileg.
  2. Netzwerkfehler — die Verbindung zu MongoDB wird während der Operation unterbrochen.

PyMongo löst pymongo.errors.OperationFailure für serverseitige Fehler (einschließlich Berechtigungsprobleme) und pymongo.errors.ConnectionFailure für Netzwerkprobleme aus. Beide abfangen:

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

Praktisches Beispiel: Sicherer Teardown in Tests

Ein verbreitetes Praxismuster ist das Löschen einer Collection am Ende eines Tests oder einer Migration, um die Datenbank sauber zu hinterlassen. Dieses Beispiel zeigt eine wiederverwendbare Hilfsfunktion, die eine Collection nur löscht, wenn sie existiert, das Ergebnis protokolliert und niemals eine Ausnahme auslöst, die einen nicht verwandten Test zum Scheitern bringen würde:

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.

Eine Collection löschen vs. alle Dokumente löschen

Dies sind zwei unterschiedliche Operationen mit unterschiedlichen Ergebnissen:

OperationAuswirkung auf die CollectionAuswirkung auf IndizesGeschwindigkeit
col.drop()Collection entferntAlle Indizes entferntSehr schnell
col.delete_many({})Collection bleibt (leer)Indizes erhaltenLangsamer bei großen Collections

Verwenden Sie drop(), wenn Sie komplett von vorne beginnen möchten — zum Beispiel zwischen Testläufen oder als Teil einer Schema-Migration, bei der sich auch das Index-Layout ändert. Verwenden Sie delete_many({}), wenn Sie die Indizes und die Konfiguration der Collection beibehalten möchten. Siehe MongoDB Delete für Details zu delete_many().

Zusammenfassung

  • Collection.drop() löscht die Collection und gibt True/False zurück. Bei einer fehlenden Collection wird keine Ausnahme ausgelöst.
  • Database.drop_collection(name) erzielt dasselbe Ergebnis und ist praktisch, wenn Sie nur den Collection-Namen als string haben.
  • Verwenden Sie db.list_collection_names(), um die Existenz vor dem Löschen zu prüfen, wenn Sie bedingte Logik benötigen.
  • Fangen Sie pymongo.errors.OperationFailure für Berechtigungsfehler und pymongo.errors.ConnectionFailure für Netzwerkprobleme ab.
  • Das Löschen entfernt sowohl Dokumente als auch Indizes. Verwenden Sie stattdessen delete_many({}), wenn Sie die Indizes behalten möchten.

Verwandte Kapitel:

Was this page helpful?