Excluindo coleções e subcoleções no Firestore
Ao trabalhar com o Firestore, podem surgir cenários em que você precisa excluir coleções ou subcoleções. No entanto, a exclusão do documento pai que abriga as subcoleções apresenta desafios. Este artigo aborda como gerenciar essas situações de maneira eficaz.
Problema de estrutura e exclusão de banco de dados
Considere um cenário com uma coleção chamada "listas", onde cada documento representa uma lista com seu ID exclusivo. Cada documento de lista possui subcoleções denominadas "funcionários" e "locais". A estrutura é a seguinte:
(lists) -listId (employees) (locations)
Se um usuário desejar excluir uma lista específica, a exclusão do documento "listId" manterá suas subcoleções, desafiando a documentação do Firestore.
Solução: exclusão sequencial
Para resolver isso, propomos uma abordagem de exclusão sequencial:
Este método garante a remoção completa da lista específica e suas subcoleções associadas.
Considerações
Embora a exclusão seja uma ferramenta eficaz, o Firebase recomenda usá-la com cautela, especialmente para coleções grandes. Contudo, para coleções menores, a exclusão é uma opção viável. Se for inevitável usar a exclusão para coleções grandes, execute-a em um ambiente de servidor confiável.
Implementação de código para Android
Para aplicativos Android, você pode usar o código a seguir para implementar o processo de exclusão:
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 e exclui documentos em lotes, garantindo a exclusão tanto da coleção quanto de suas subcoleções.
Isenção de responsabilidade: Todos os recursos fornecidos são parcialmente provenientes da Internet. Se houver qualquer violação de seus direitos autorais ou outros direitos e interesses, explique os motivos detalhados e forneça prova de direitos autorais ou direitos e interesses e envie-a para o e-mail: [email protected]. Nós cuidaremos disso para você o mais rápido possível.
Copyright© 2022 湘ICP备2022001581号-3