Delete

delete() es una etapa del lenguaje de manipulación de datos (DML) que permite que una consulta quite documentos según los resultados de una consulta. Esta etapa se puede adjuntar al final de una consulta y borrará todos los documentos a los que hace referencia el campo __name__ de la etapa anterior.

Ejemplos

Por ejemplo, la siguiente consulta borra todos los documentos users con address.users configurado como USA y con __create_time__ inferior a 10 días:

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();
Go
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)

Comportamiento

Respuesta

La etapa delete() siempre emite un solo documento como { documents_modified: 28L } que describe cuántos documentos se borraron.

Borrado completo de la colección

Para borrar todos los documentos de una colección, agrega delete() a la etapa de entrada de la siguiente manera:

Node.js

const results = await db.pipeline()
  .collection("/users")
  .delete()
  .execute();

Asegúrate de que la etapa where(...) antes de la delete() final limite correctamente los documentos para actualizar solo los documentos esperados. Es una práctica recomendada ejecutar la consulta sin la etapa delete() final primero para validar que solo se quiten los documentos deseados.

Etapa final

La etapa delete() debe estar al final de una canalización. No se pueden proporcionar más etapas.

Borrar todo

De forma predeterminada, la etapa delete() quitará todos los documentos a los que hace referencia la etapa anterior. Si deseas limitar el tamaño de la carga de trabajo o sabes que las condiciones del filtro coinciden exactamente con un documento, se puede agregar un limit(1) antes de la delete() final para limitar el trabajo total.

Mutaciones de colecciones cruzadas

La etapa delete() final aplicará mutaciones a cualquier documento al que haga referencia __name__ (siempre que se proporcione toda la autenticación necesaria). Esto incluye borrar documentos de varias colecciones o grupos de colecciones diferentes como parte de la misma solicitud.

Se requiere __name__

La etapa delete() requiere que la etapa anterior proporcione un campo __name__ que contenga una referencia de documento para quitar. Si no lo haces, se producirá un error de tiempo de ejecución y, cuando se ejecute fuera de una transacción, puede generar un éxito parcial.

La mayoría de las etapas de entrada, como collection(...), collection_group(...), database(...) y documents(...), incluyen el campo __name__ de forma predeterminada, por lo que esto solo es relevante si se usa una proyección (como select(...)) o se realiza una transformación en los documentos (como aggregate(...)).

La respuesta incluye un resumen de la cantidad de documentos modificados. Por ejemplo, la siguiente respuesta confirma que la canalización modificó tres documentos:

{documents_modified: 3L}

Limitaciones

  • Las etapas de DML no admiten Cloud Firestore Security Rules. Se rechazan los intentos de operaciones de DML a través de Cloud Firestore Security Rules.

  • Durante la versión preliminar de esta función, no puedes ejecutar etapas de DML en una transacción. Para obtener más información sobre el comportamiento de coherencia, consulta Coherencia.

  • Si la etapa anterior a la etapa de DML produce varios documentos con el mismo __name__, se procesa cada instancia. Para update(...), esto significa que el mismo documento de destino se puede modificar varias veces. Para delete(...), los intentos posteriores después del primero serán no-ops.