Eliminar colecciones y subcolecciones en Firestore
Al trabajar con Firestore, pueden surgir escenarios en los que necesite eliminar colecciones o subcolecciones. Sin embargo, eliminar el documento principal que alberga las subcolecciones presenta desafíos. Este artículo aborda cómo gestionar este tipo de situaciones de forma eficaz.
Estructura de la base de datos y problema de eliminación
Considere un escenario con una colección llamada "listas", donde cada documento representa una lista con su identificación única. Cada documento de lista tiene subcolecciones denominadas "empleados" y "ubicaciones". La estructura es la siguiente:
(lists) -listId (employees) (locations)
Si un usuario desea eliminar una lista específica, eliminar el documento "listId" conservará sus subcolecciones, desafiando la documentación de Firestore.
Solución: eliminación secuencial
Para solucionar este problema, proponemos un enfoque de eliminación secuencial:
Este método garantiza la eliminación completa de la lista específica y sus subcolecciones asociadas.
Consideraciones
Si bien la eliminación es una herramienta eficaz, Firebase recomienda usarla con precaución, especialmente para colecciones grandes. Sin embargo, para colecciones más pequeñas, la eliminación es una opción viable. Si es inevitable utilizar la eliminación para colecciones grandes, ejecútela en un entorno de servidor confiable.
Implementación de código para Android
Para aplicaciones de Android, puede usar el siguiente código para implementar el proceso de eliminación:
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(); }
Este código recupera y elimina documentos en lotes, asegurando la eliminación tanto de la colección como de sus subcolecciones.
Descargo de responsabilidad: Todos los recursos proporcionados provienen en parte de Internet. Si existe alguna infracción de sus derechos de autor u otros derechos e intereses, explique los motivos detallados y proporcione pruebas de los derechos de autor o derechos e intereses y luego envíelos al correo electrónico: [email protected]. Lo manejaremos por usted lo antes posible.
Copyright© 2022 湘ICP备2022001581号-3