Suppression de collections et de sous-collections dans Firestore
Lorsque vous travaillez avec Firestore, des scénarios peuvent survenir dans lesquels vous devez supprimer des collections ou des sous-collections. Cependant, la suppression du document parent qui héberge les sous-collections présente des défis. Cet article explique comment gérer efficacement de telles situations.
Problème de structure de base de données et de suppression
Considérez un scénario avec une collection appelée « listes », où chaque document représente une liste. avec son identifiant unique. Chaque document de liste comporte des sous-collections nommées « employés » et « emplacements ». La structure est la suivante :
(lists) -listId (employees) (locations)
Si un utilisateur souhaite supprimer une liste spécifique, la suppression du document "listId" conservera ses sous-collections, défiant la documentation de Firestore.
Solution : Suppression séquentielle
Pour résoudre ce problème, nous proposons une approche de suppression séquentielle :
Cette méthode garantit la suppression complète de la liste spécifique et de ses sous-collections associées.
Considérations
Bien que la suppression soit un outil efficace, Firebase recommande de l'utiliser avec prudence, en particulier pour les grandes collections. Cependant, pour les petites collections, la suppression est une option viable. Si l'utilisation de la suppression pour des collections volumineuses est inévitable, exécutez-la sur un environnement de serveur de confiance.
Implémentation du code pour Android
Pour les applications Android, vous pouvez utiliser le code suivant pour mettre en œuvre le processus de suppression :
private void deleteCollection(final CollectionReference collection, Executor executor) { Tasks.call(executor, () -> { int batchSize = 10; Query query = collection.orderBy(FieldPath.documentId()).limit(batchSize); List<DocumentSnapshot> deleted = deleteQueryBatch(query); while (deleted.size() >= batchSize) { DocumentSnapshot last = deleted.get(deleted.size() - 1); query = collection.orderBy(FieldPath.documentId()).startAfter(last.getId()).limit(batchSize); deleted = deleteQueryBatch(query); } return null; }); } @WorkerThread private List<DocumentSnapshot> deleteQueryBatch(final Query query) throws Exception { QuerySnapshot querySnapshot = Tasks.await(query.get()); WriteBatch batch = query.getFirestore().batch(); for (DocumentSnapshot snapshot : querySnapshot) { batch.delete(snapshot.getReference()); } Tasks.await(batch.commit()); return querySnapshot.getDocuments(); }
Ce code récupère et supprime les documents par lots, assurant la suppression à la fois de la collection et de ses sous-collections.
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!