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:
-
Encuentre todos los documentos debajo de
employees
colección deemployees
y elimínelos -
Encuentre todos los documentos debajo de
locations
colección delocations
y elimínelos -
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();
}