Use os estágios da linguagem de manipulação de dados (DML, na sigla em inglês) update(...) e delete(...) para criar pipelines de dados que possam consultar documentos e excluir ou modificar dados.
Requisitos da edição
As operações descritas nesta página exigem a edição Enterprise do Firestore.
Antes de começar
Você precisa saber como consultar um banco de dados com operações de pipeline.
Atualizar documentos
Use o estágio DML update(...) para criar pipelines de dados
que possam consultar documentos e adicionar ou modificar dados.
Todos os estágios DML precisam estar no final do pipeline.
Os documentos que chegam a esse estágio precisam incluir o campo __name__ para identificar quais documentos atualizar. A operação falha se algum dos documentos que você tentar atualizar não existir.
Por exemplo, a operação a seguir preenche uma mudança de modelo de dados para todos os documentos em um grupo de coleções. O pipeline adiciona um campo preferences.color a todos os documentos no grupo de coleções users que não têm esse campo.
Node.js
const snapshot = await db.pipeline() .collectionGroup("users") .where(not(exists(field("preferences.color")))) .addFields(constant(null).as("preferences.color")) .removeFields("color") .update() .execute();
Python
from google.cloud.firestore_v1.pipeline_expressions import Constant, Field, Not snapshot = ( client.pipeline() .collection_group("users") .where(Not(Field.of("preferences.color").exists())) .add_fields(Constant.of(None).as_("preferences.color")) .remove_fields("color") .update() .execute() )
Java
Pipeline.Snapshot snapshot = firestore.pipeline() .collectionGroup("users") .where(not(exists(field("preferences.color")))) .addFields(constant((String) null).as("preferences.color")) .removeFields("color") .update() .execute().get();
Excluir documentos
Use os estágios DML delete(...) stage para criar pipelines de dados
que possam consultar documentos e excluir dados.
Para evitar exclusões em massa acidentais, os pipelines que terminam em delete(...) precisam incluir pelo menos um estágio where(...).
Todos os estágios DML precisam estar no final do pipeline.
Por exemplo, o pipeline a seguir exclui todos os users documentos com
address.users definido como USA e com __create_time__ menor que 10 dias:
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();
Consistência
As operações de pipeline com estágios update(...) e delete() não são compatíveis com uma transação. Os estágios DML são executados fora de uma transação com o seguinte comportamento:
- Cada documento é atualizado de forma independente. Isso significa que as operações não são atômicas em todos os documentos. A operação falha no primeiro erro, e o sucesso parcial é possível.
- Os seguintes estágios são compatíveis:
collection(...)collection_group(...)where(...)select(...)add_fields(...)remove_fields(...)let(...)sort(...)limit(...)offset(...)
- Os seguintes estágios não são compatíveis:
aggregate(...)distinct(...)unnest(...)find_nearest(...)- Os estágios de várias consultas, como
union(...), junções e subconsultas, não são permitidos antes de um estágio DML.
Limitações
Observe as seguintes limitações para estágios DML:
- Os estágios DML precisam ser os últimos estágios em uma definição de pipeline antes de chamar
.execute(). - As operações de pipeline com estágios
update(...)edelete()não são compatíveis com uma transação. - Se o estágio anterior ao DML produzir vários documentos com o mesmo
__name__, cada instância será processada. Paraupdate(...), isso significa que o mesmo documento de destino pode ser modificado várias vezes. Paradelete(...), as tentativas subsequentes após a primeira serão sem operação.