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()undDatabase.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 goneEine 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?
| Situation | Empfohlene Methode |
|---|---|
Sie haben bereits ein Collection-Objekt | col.drop() |
| Sie haben nur den Collection-Namen als string | db.drop_collection(name) |
| Löschen innerhalb einer Session oder Transaktion | db.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:
- Unzureichende Berechtigungen — der verbundene Benutzer hat nicht das
dropCollection-Privileg. - 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:
| Operation | Auswirkung auf die Collection | Auswirkung auf Indizes | Geschwindigkeit |
|---|---|---|---|
col.drop() | Collection entfernt | Alle Indizes entfernt | Sehr schnell |
col.delete_many({}) | Collection bleibt (leer) | Indizes erhalten | Langsamer 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 gibtTrue/Falsezurü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.OperationFailurefür Berechtigungsfehler undpymongo.errors.ConnectionFailurefü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:
- MongoDB Create Collection — Collections mit Optionen und Validatoren erstellen
- MongoDB Delete — einzelne Dokumente mit
delete_one()unddelete_many()löschen - MongoDB Get Started — PyMongo installieren und mit MongoDB verbinden