theory_03__delete.md

Занятие 62Markdown106 строк

← К репозиторию занятия · 16__MongoDB_write/theory_03__delete.md

Удаление документов

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

1. deleteOne

Удаляет первый найденный документ, который соответствует заданному фильтру.

Синтаксис:

db.collection.deleteOne(
  { <фильтр> } // Условие для удаления
)

Особенности:

  • Удаляет только один документ, даже если фильтру соответствует несколько документов.
  • Если фильтр пустой, удаляет первый документ в коллекции (не рекомендуется использовать без фильтра).

Пример:

db.collection.deleteOne({ name: "Alice" });

(Удалит первый документ, где name равно "Alice")

2. deleteMany

Удаляет все документы, которые соответствуют заданному фильтру.

Синтаксис:

db.collection.deleteMany(
  { <фильтр> } // Условие для удаления
)

Особенности:

  • Удаляет все документы, соответствующие фильтру.
  • Если фильтр пустой, удаляет все документы в коллекции (будьте осторожны).

Пример:

db.collection.deleteMany({ status: "inactive" });

(Удалит все документы, где status равно "inactive")

3. findOneAndDelete

Находит и удаляет один документ, возвращая его содержимое.

Синтаксис:

db.collection.findOneAndDelete(
  { <фильтр> },          // Условие для удаления
  { sort: { <поле>: 1 } } // (необязательно) Сортировка, чтобы определить, какой документ удалить
)

Особенности:

  • Удаляет один документ, который первым соответствует фильтру.
  • Возвращает удалённый документ.
  • Полезен, если нужно получить данные документа перед его удалением.
  • Можно указать сортировку, чтобы удалять, например, самый старый или новый документ.

Пример:

db.collection.findOneAndDelete(
  { status: "inactive" },
  { sort: { createdAt: -1 } }
);

(Удалит последний созданный документ с status равным "inactive" и вернёт его)

Сравнение методов удаления:

МетодДействиеКоличество удаляемых документовВозвращает удалённый документ?
deleteOneУдаляет первый документ1Нет
deleteManyУдаляет все соответствующиеВсеНет
findOneAndDeleteУдаляет один документ1Да

Примеры работы: Удалить документ по ID

db.collection.deleteOne({ _id: ObjectId("64d1b770f0e1ad3b7c0e2a6a") });

Удалить все документы с определённым значением поля

db.collection.deleteMany({ category: "archived" });

Удалить документ и вернуть его содержимое

const deletedDoc = db.collection.findOneAndDelete({ status: "inactive" });
console.log("Удалённый документ:", deletedDoc);

Важные замечания

  • Пустой фильтр: Использование пустого фильтра ({}) может удалить все документы в коллекции, что необратимо. Применяйте это с осторожностью.
  • Ограничение памяти: Методы удаления не возвращают данные всех удалённых документов. Если нужно работать с данными перед удалением, используйте find для выборки, а затем deleteOne или deleteMany.
  • Скорость работы:
    • deleteMany быстрее, если нужно удалить много документов.
    • findOneAndDelete полезен для атомарных операций.