W3docs

Удаление коллекции MongoDB в Python

Как удалить коллекцию MongoDB в Python с PyMongo: методы drop(), drop_collection(), проверка существования и безопасное удаление.

Удаление коллекции MongoDB безвозвратно уничтожает все документы в ней и удаляет саму коллекцию. Операция выполняется немедленно и не может быть отменена, поэтому важно понимать, что предлагает PyMongo, как проверить существование коллекции перед её удалением и какой метод выбрать в той или иной ситуации.

В этой главе рассматривается:

  • Два способа удаления коллекции — Collection.drop() и Database.drop_collection()
  • Проверка существования коллекции перед удалением
  • Грамотная обработка ошибок
  • Безопасные паттерны удаления в тестах и миграциях

Предварительные требования: Python 3.8+, установленный PyMongo (pip install pymongo) и работающий сервер MongoDB. Если вы ещё не настроили окружение, см. MongoDB: начало работы и MongoDB: создание базы данных.

Подключение к MongoDB

Любая операция начинается с создания MongoClient. Передайте строку подключения к вашему серверу:

import pymongo

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

Если сервер требует аутентификации, включите учётные данные в URI:

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

Подробное описание параметров подключения см. в разделе MongoDB: создание базы данных.

Удаление коллекции с помощью drop()

Самый прямой способ — вызвать drop() на объекте Collection:

import pymongo

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

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

drop() возвращает True, если коллекция существовала и была удалена, или False, если коллекция не существовала. PyMongo не вызывает исключение при попытке удалить несуществующую коллекцию — он молча возвращает False.

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

Удаление коллекции с помощью drop_collection()

Коллекцию также можно удалить через объект Database, используя метод drop_collection(). Это удобно, когда у вас есть только имя коллекции в виде строки и вы не хотите создавать объект Collection:

import pymongo

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

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

drop_collection() также принимает объект Collection напрямую, поэтому следующие два вызова эквивалентны:

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

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

Какой метод использовать?

СитуацияРекомендуемый метод
У вас уже есть объект Collectioncol.drop()
У вас только имя коллекции в виде строкиdb.drop_collection(name)
Удаление в рамках сессии или транзакцииdb.drop_collection(name, session=session)

Проверка существования коллекции перед удалением

Поскольку drop() молча завершается успешно даже при отсутствии коллекции, иногда стоит убедиться в её существовании перед удалением — например, чтобы вывести предупреждение или избежать вводящего в заблуждение вывода скрипта:

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() возвращает список строк — по одной на каждую коллекцию в базе данных. Проверка через in — это простой тест на вхождение.

Обработка ошибок

Большинство операций удаления выполняются без ошибок, однако в двух случаях возможны сбои:

  1. Недостаточно прав — у подключённого пользователя нет привилегии dropCollection.
  2. Сетевые ошибки — соединение с MongoDB прервалось в ходе операции.

PyMongo вызывает pymongo.errors.OperationFailure при ошибках на стороне сервера (включая проблемы с правами) и pymongo.errors.ConnectionFailure при сетевых сбоях. Перехватывайте оба исключения:

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

Практический пример: безопасное удаление в тестах

Распространённый паттерн — удалять коллекцию в конце теста или миграции, чтобы оставить базу данных чистой. В этом примере показана повторно используемая вспомогательная функция, которая удаляет коллекцию только при её существовании, логирует результат и никогда не бросает исключение, которое могло бы нарушить несвязанный тест:

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.

Удаление коллекции vs. удаление всех документов

Это две разные операции с разными результатами:

ОперацияВоздействие на коллекциюВоздействие на индексыСкорость
col.drop()Коллекция удаляетсяВсе индексы удаляютсяОчень быстро
col.delete_many({})Коллекция остаётся (пустой)Индексы сохраняютсяМедленнее на больших коллекциях

Используйте drop(), когда нужно начать с чистого листа — например, между запусками тестов или в ходе миграции схемы, когда структура индексов тоже изменится. Используйте delete_many({}), если нужно сохранить индексы и конфигурацию коллекции. Подробнее о delete_many() см. в разделе MongoDB Delete.

Итоги

  • Collection.drop() удаляет коллекцию и возвращает True/False. При отсутствии коллекции исключение не вызывается.
  • Database.drop_collection(name) даёт тот же результат и удобен, когда у вас есть только имя коллекции в виде строки.
  • Используйте db.list_collection_names() для проверки существования перед удалением, когда нужна условная логика.
  • Перехватывайте pymongo.errors.OperationFailure для ошибок прав и pymongo.errors.ConnectionFailure для сетевых проблем.
  • Удаление коллекции уничтожает как документы, так и индексы. Используйте delete_many({}), если хотите сохранить индексы.

Связанные главы:

Was this page helpful?