delete() est une étape du langage de manipulation de données (LMD) qui permet à une requête de supprimer des documents en fonction des résultats d'une requête. Cette étape peut être ajoutée à la fin d'une requête et supprime tous les documents référencés par le champ __name__ de l'étape précédente.
Exemples
Par exemple, la requête suivante supprime tous les documents users dont le champ
address.users est défini sur USA et dont le champ __create_time__ est inférieur à 10 jours :
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)
Comportement
Réponse
L'étape delete() émet toujours un seul document, tel que { documents_modified: 28L }, décrivant le nombre de documents supprimés.
Suppression complète de la collection
Il est possible de supprimer tous les documents d'une collection en ajoutant delete() à l'étape d'entrée, comme suit :
Node.js
const results = await db.pipeline()
.collection("/users")
.delete()
.execute();
Assurez-vous que l'étape where(...) avant la dernière étape delete() limite correctement les documents afin de ne mettre à jour que les documents attendus. Il est recommandé d'exécuter d'abord la requête sans la dernière étape delete() pour vérifier que seuls les documents prévus sont supprimés.
Étape finale
L'étape delete() doit se trouver à la fin d'un pipeline. Aucune autre étape ne peut être fournie.
Tout supprimer
Par défaut, l'étape delete() supprime tous les documents référencés par l'étape précédente. Si vous souhaitez limiter la taille de la charge de travail ou si vous savez que les conditions de filtrage ne correspondent qu'à un seul document, vous pouvez ajouter limit(1) avant la dernière étape delete() pour limiter le travail total.
Mutations entre collections
La dernière étape delete() applique des mutations à n'importe quel document référencé par __name__ (en supposant que toutes les authentifications nécessaires sont fournies). Cela inclut la suppression de documents de plusieurs collections ou groupes de collections différents dans le cadre de la même requête.
__name__ obligatoire
L'étape delete() nécessite que l'étape précédente fournisse un champ __name__ contenant une référence de document à supprimer. À défaut, une erreur d'exécution se produit et, lorsqu'elle est exécutée en dehors d'une transaction, elle peut entraîner une réussite partielle.
La plupart des étapes d'entrée, telles que collection(...),
collection_group(...),
database(...), et
documents(...),
incluent le champ __name__ par défaut. Cela n'est donc pertinent que si vous utilisez une
projection (telle que select(...)) ou si vous effectuez une
transformation sur les documents (telle que
aggregate(...)).
La réponse inclut un résumé du nombre de documents modifiés. Par exemple, la réponse suivante confirme que le pipeline a modifié trois documents :
{documents_modified: 3L}
Limites
Les étapes LMD ne sont pas compatibles avec Cloud Firestore Security Rules. Les tentatives d'opération LMD via Cloud Firestore Security Rules sont refusées.
Pendant l'aperçu de cette fonctionnalité, vous ne pouvez pas exécuter d'étapes LMD dans une transaction. Pour en savoir plus sur le comportement de cohérence, consultez la section Cohérence.
Si l'étape précédant l'étape LMD génère plusieurs documents avec le même
__name__, chaque instance est traitée. Pourupdate(...), cela signifie que le même document cible peut être modifié plusieurs fois. Pourdelete(...), les tentatives suivantes après la première seront des no-ops.