Home > Software design >  How to delete documents from two collections in mongodb
How to delete documents from two collections in mongodb

Time:11-25

As of now I am able to delete the specific files from filestorage.files collection based on query but I am trying to delete the specific chunks from filesstorage.chunks collection based on files_id. Can someone please suggest me the good approach to achieve it.

Should I use aggregations ? or any looping mechanism ?

Please find the below details

filestorage.files collection:

[{
  "_id": {
    "$oid": "635a68aa0651c2d869fc3fd3"
  },
  "length": 878669,
  "chunkSize": 261120,
  "uploadDate": {
    "$date": {
      "$numberLong": "1666869418612"
    }
  },
  "filename": "pexels-lucie-liz-3165335_2022-10-27T11-16-58.jpg",
  "contentType": "image/jpeg",
  "metadata": {
    "originalname": "pexels-lucie-liz-3165335.jpg",
    "parentFolder": {
      "$oid": "636cd238692344da47f3e301"
    },
    "path": "files/Folder1/Folder3/pexels-lucie-liz-3165335_2022-10-27T11-16-58.jpg"
  }
},

{
  "_id": {
    "$oid": "635a68aa0651c2d869fc3fd4"
  },
  "length": 878669,
  "chunkSize": 261120,
  "uploadDate": {
    "$date": {
      "$numberLong": "1666869418612"
    }
  },
  "filename": "nature-3165335_2022-10-27T11-16-58.jpg",
  "contentType": "image/jpeg",
  "metadata": {
    "originalname": "nature-3165335.jpg",
    "parentFolder": {
      "$oid": "636cd238692344da47f3e301"
    },
    "path": "files/Folder1/Folder3/nature-3165335_2022-10-27T11-16-58.jpg"
  }
}]

filestorage.chunks collection :

[{
  "_id": {
    "$oid": "635a68aa0651c2d869fc3fe6"
  },
  "files_id": {
    "$oid": "635a68aa0651c2d869fc3fd3"
  },
  "n": 0,
  "data": {
    "$binary": {
    "base64" : "xyz"
      "subType": "00"
    }
  }
},
{
  "_id": {
    "$oid": "635a68aa0651c2d869fc3fd5"
  },
  "files_id": {
    "$oid": "635a68aa0651c2d869fc3fd3"
  },
  "n": 0,
  "data": {
    "$binary": {
    "base64" : "abcd"
      "subType": "00"
    }
  }
}]

Here is what I have tried :

 delete_folder_files: async (ctx:any) => {
// here I am able to delete all the files but confused how to connect chunks schema and delete chunks  // based on files_id.
      await FileStorage.deleteMany({'metadata.parentFolder': ctx.params.id}); 
      await FileChunk.deleteMany({files_id : ? })
      ctx.status = HttpStatusCode.OK;
    }

CodePudding user response:

As I can see you are deleting the file ids . So after that you do not have any relation to delete the chunks in fileChunk collection . Here is what I am thinking , First get all the file ids as an array and later you can delete the chunks with the folder_ids by querying them as array.

      const file_ids = await FileStorage.find({'metadata.parentFolder': ctx.params.id },{_id:1}).distinct('_id');
      await FileStorage.deleteMany({'metadata.parentFolder':ctx.params.id });
      await FileChunk.deleteMany({files_id:{$in:file_ids}});

Note : Please check the performance of the query by uploading multiple files.

  • Related