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 et de suppression de base de données
Considérons un scénario avec une collection appelée « listes », dans laquelle 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 approuvé.
Implémentation du code pour Android
Pour les applications Android, vous pouvez utiliser le code suivant pour implémenter 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); Listdeleted = 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 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, garantissant la suppression à la fois de la collection et de ses sous-collections.
Clause de non-responsabilité: Toutes les ressources fournies proviennent en partie d'Internet. En cas de violation de vos droits d'auteur ou d'autres droits et intérêts, veuillez expliquer les raisons détaillées et fournir une preuve du droit d'auteur ou des droits et intérêts, puis l'envoyer à l'adresse e-mail : [email protected]. Nous nous en occuperons pour vous dans les plus brefs délais.
Copyright© 2022 湘ICP备2022001581号-3