Estou tentando excluir recursivamente um documento do Firestore e suas subcoleções, mas estou tendo um problema quando a função encontra um documento aninhado que contém subcoleções.
Aqui está a estrutura com a qual estou lidando:
parentCol/uid/childCol_1/child_Doc1
parentCol/uid/childCol_1/child_Doc1/child_Col2/child_Doc2
Eu escrevi a seguinte função delete recursiva, mas quando ela encontra child_Doc1, que tem subcoleções, ela parece parar e não exclui os dados aninhados sob child_Col2. Em vez disso, ela apenas registra o caminho e não prossegue.
// parentCol/uid/childCol_1/child_Doc1
// parentCol/uid/childCol_1/child_Doc1/child_Col2/child_Doc2
const deleteDocumentAndCollections = async (path: string): Promise<void> => {
try {
console.log('deletePath:====>', path);
// Get a reference to the initial document
const documentRef = firestore.doc(path);
// List all subcollections under the document to delete
const subcollections = await documentRef.listCollections();
console.log('Subcollections:====>', subcollections);
// Error deleting document and subcollections: Error: Value for argument "documentPath" must point to a document,
// but was parentCol/uid/childCol_1/
// Your path does not contain an even number of components.
// Recursively process and delete each subcollection
for (const subcollection of subcollections) {
try {
// Call the function recursively to delete the subcollection recursively
await deleteDocumentAndCollections(subcollection.path);
} catch (error) {
console.error('Error processing subcollection:', error);
}
}
// Now, delete the document itself
console.log('Deleting document:', documentRef.path);
await documentRef.delete();
console.log('Successfully deleted document:', documentRef.path);
} catch (error) {
console.error('Error deleting document and subcollections:', error);
}
};
Sua função está passando um caminho de subcoleção para si mesma, o que imediatamente assume que é um caminho de documento. Você não pode criar uma referência de documento (com
firestore.doc()
) usando o caminho de subcoleção. É isso que a mensagem de erro está tentando lhe dizer.Em vez de chamar
deleteDocumentAndCollections(subcollection.path)
, você precisará de uma segunda função que pegue um caminho de subcoleção, liste seus caminhos de documentos aninhados e chamedeleteDocumentAndCollections
cada um desses caminhos de documentos.