"Se um trabalhador quiser fazer bem o seu trabalho, ele deve primeiro afiar suas ferramentas." - Confúcio, "Os Analectos de Confúcio. Lu Linggong"
Primeira página > Programação > Como excluir efetivamente coleções e subcoleções no Firestore?

Como excluir efetivamente coleções e subcoleções no Firestore?

Publicado em 2024-11-03
Navegar:973

 How to Effectively Delete Collections and Subcollections in Firestore?

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:

  1. Recupere todos os documentos da subcoleção "employees" e exclua-os.
  2. Repita o processo para o Subcoleção "locais".
  3. Finalmente, exclua o documento "listId".

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);
        List 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 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.

Tutorial mais recente Mais>

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