Home > Mobile >  deleting a collection that includes a nested sub collection in firebase?
deleting a collection that includes a nested sub collection in firebase?

Time:06-17

I have the following batch, where I delete three documents in a collection, the data-set-c collection however has one nested collection for massages where each message is a doc each.

the problem is that the (data-set-c) collection never gets deleted, I don't know if it is due to the nesting taking place? will deleting this way affect also sub-collection? or is it the rules that are blocking it since my rules are specific to the deepest level endpoint, or should use the cloud function instead since this doc will be massive later on, and each day is massages collection but the main issue here is how to delete this one level nested structure.

could you please take a look and see what I am doing wrong.

// Batch
      const batch = writeBatch(db);
      
      // data-set-a/{Id}/sub-set-a/{subSetId} ---> the direct document
      const colA = collection(db, data-set-a,_authContext.currentUser.uid, sub-set-a);
      
      // data-set-b/{Id}/sub-set-b/{subSetId} ---> the direct document
      const colB = collection(db, data-set-b, _authContext.currentUser.uid, sub-set-b);
      
       // data-set-c/{Id}/sub-set-c/{subSetId}/masseges/{mgsId} /*nested collection*/ 
      const colC = collection(db, 'data-set-c', _authContext.currentUser.uid, sub-set-c);
      
      const docA = doc(colA, subSetId);
      const docB = doc(colB, subSetId);
      const docC = doc(colC, subSetId);
      const docsArr = [docA, docB, docC];

      docsArr.forEach((col: any) => {
      batch.delete(col)
      });
      await batch.commit();

// sub-set-a   sub-set-b SECURITY RULES 
  match /data-set-a/Id}sub-set-a/{subId} {
  allow delete: if request.auth != null 
  && request.auth.token.email_verified
  && request.auth.uid  == Id  
  }    

// sub-set-c SECURITY RULES 
   match /data-set-c/{Id}/sub-set-c/{subSetId}/masseges/{mgsId} {
   allow delete: if request.auth != null 
   && request.auth.token.email_verified
   && request.auth.uid  == Id
  }

enter image description here

CodePudding user response:

the problem is that the (data-set-c) collection never gets deleted.

That's the expected behavior. If you delete a document, doesn't mean that you delete all sub-collections that exist within that document. Besides that, that document ID will continue to exist and the Firebase Console will display it in italic.

will deleting this way affect also sub-collection?

No, it won't.

or is it the rules that are blocking it since my rules are specific to the deepest level endpoint.

If it was about the security rules, then you would have received an error indicating that.

or should use cloud function instead since this doc will be massive later on

Yes, you can indeed use a Cloud Function to delete all documents that exist in all sub-collection of the document that was deleted.

How to delete this one-level nested structure.

You can achieve this by iterating each sub-collection, and by deleting each document. But don't do it on the client!

  • Related