android firebase google-cloud-firestore

android - Cómo modelar esta estructura para manejar la eliminación



firebase google-cloud-firestore (1)

Tengo una colección llamada listas y tiene un documento de identificación que representa la identificación de la lista. Este documento tiene una colección llamada employees y otra llamada locations .

La estructura se ve así:

(lists) -listId (employees) (locations)

Si el usuario desea eliminar una lista específica, entonces el problema es que no podemos eliminar listId porque eso mantendrá la colección (como se mencionó en los documentos de Firestore).

¿Cómo se puede modelar la estructura para satisfacer las necesidades? Parece que no puedo evitar la necesidad de una subcolección.

¿Alguna recomendacion?


No es necesario reestructurar su base de datos para eliminar algunas colecciones. Para eliminar una colección o subcolección completa en Cloud Firestore, recupere todos los documentos dentro de la colección o subcolección y elimínelos. Entonces, para eliminar una lista específica, siga los siguientes pasos:

  1. Encuentre todos los documentos debajo de employees colección de employees y elimínelos
  2. Encuentre todos los documentos debajo de locations colección de locations y elimínelos
  3. Eliminar el documento listId

Si tiene colecciones más grandes, es posible que desee eliminar los documentos en lotes más pequeños para evitar errores de falta de memoria. Repita el proceso hasta que haya eliminado toda la colección o subcolección.

Incluso si el equipo de Firebase no recomienda la operación de eliminación porque has negative security and performance implications , aún puede hacerlo, pero solo para pequeñas colecciones. Si necesita eliminar colecciones completas para la web, hágalo solo desde un entorno de servidor de confianza.

Para Android, puede usar el siguiente código:

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(); }