delete() — это этап языка манипулирования данными (DML), позволяющий удалять документы на основе результатов запроса. Этот этап может быть добавлен в конец запроса и удалит все документы, на которые ссылается поле __name__ из предыдущего этапа.
Примеры
Например, следующий запрос удаляет все документы users , у которых address.users установлено на USA и __create_time__ меньше 10 дней:
Node.js
const pipeline = db.pipeline() .collectionGroup("users") .where(field("address.country").equal("USA")) .where(field("__create_time__").timestampAdd("day", 10).lessThan(currentTimestamp())) .delete(); await pipeline.execute();
Python
from google.cloud.firestore_v1.pipeline_expressions import CurrentTimestamp, Field snapshot = ( client.pipeline() .collection_group("users") .where(Field.of("address.country").equal("USA")) .where( Field.of("__create_time__") .timestamp_add("day", 10) .less_than(CurrentTimestamp()) ) .delete() .execute() )
Java
Pipeline.Snapshot deleteResults = firestore.pipeline() .collectionGroup("users") .where(field("address.country").equal("USA")) .where(field("__create_time__").add(constant(10)).lessThan(currentTimestamp())) .delete() .execute().get();
Идти
snapshot := client.Pipeline(). CollectionGroup("users"). Where(firestore.FieldOf("address.country").Equal("USA")). Where(firestore.FieldOf("__create_time__").Add(firestore.ConstantOf(10)).LessThan(firestore.CurrentTimestamp())). Delete(). Execute(ctx)
Поведение
Ответ
На этапе delete() всегда генерируется один документ, например, { documents_modified: 28L } описывающий количество удаленных документов.
Полное удаление коллекции
Удалить все документы из коллекции можно, добавив delete() к этапу ввода следующим образом:
Node.js
const results = await db.pipeline()
.collection("/users")
.delete()
.execute();
Убедитесь, что этап where(...) перед окончательным delete() корректно ограничивает список документов, обновляя только ожидаемые. Рекомендуется сначала выполнить запрос без этапа окончательного delete() чтобы убедиться, что удаляются только нужные документы.
Финальный этап
Этап delete() должен выполняться в конце конвейера, дальнейшие этапы не предусмотрены.
Удалить все
По умолчанию этап delete() удалит все документы, на которые ссылался предыдущий этап. Если вы хотите ограничить размер рабочей нагрузки или знаете, что условия фильтра соответствуют ровно одному документу, перед окончательным delete() можно добавить limit(1) , чтобы ограничить общий объем работы.
Мутации, полученные в результате перекрестного сбора
На заключительном этапе delete() будут применены изменения ко всем документам, на которые ссылается __name__ (при условии предоставления всей необходимой аутентификации). Это включает удаление документов из нескольких разных коллекций или групп коллекций в рамках одного запроса.
__name__ Обязательно
Для выполнения этапа delete() необходимо, чтобы предыдущий этап предоставил поле __name__ , содержащее ссылку на удаляемый документ. Невыполнение этого требования приведет к ошибке во время выполнения, а при выполнении вне транзакции — к частичному успеху.
Большинство этапов обработки входных данных, таких как collection(...) , collection_group(...) , database(...) и documents(...) , по умолчанию включают поле __name__ , поэтому оно актуально только при использовании проекции (например, select(...) ) или выполнении преобразования документов (например, aggregate(...) ).
В ответе содержится сводная информация о количестве измененных документов. Например, следующий ответ подтверждает, что конвейер обработки данных изменил три документа:
{documents_modified: 3L}
Ограничения
Этапы DML не поддерживают Cloud Firestore Security Rules . Попытки выполнения операций DML через Cloud Firestore Security Rules будут отклонены.
В режиме предварительного просмотра этой функции выполнение операций DML в рамках транзакции невозможно. Дополнительную информацию о поведении в отношении согласованности см. в разделе «Согласованность» .
Если на этапе, предшествующем этапу DML, создается несколько документов с одинаковым
__name__, каждый экземпляр обрабатывается. Дляupdate(...)это означает, что один и тот же целевой документ может быть изменен несколько раз. Дляdelete(...)последующие попытки после первой будут бездействовать.