Estoy tratando de eliminar un archivo y un fragmento de mi base de datos MongoDB, pero mi ruta solo elimina el archivo pero no el fragmento. He visto algunas soluciones de StackOverflow para este problema, pero ahora están desactualizadas o se basan en la función remove() obsoleta. Vi otra solución que afirmaba que agregar root: bucketName a las opciones de consulta de eliminación soluciona este problema, pero no fue así para mí.
const router = require("express").Router(); var mongoose = require("mongoose"); var Schema = mongoose.Schema; var ObjectId = require("mongodb").ObjectId; const { authUser } = require("../middleware/auth"); const uploadMulter = require("../middleware/upload"); const Grid = require("gridfs-stream"); const connection = mongoose.connection; let gfs, gridfsBucket; connection.once("open", () => { gfs = Grid(connection.db, mongoose.mongo); }); router.delete("/files/:_id", (req, res) => { gfs .collection("profilePictures") .deleteOne({ _id: ObjectId(req.params._id) }, (err) => {});//only deletes the profilePicture.file, but not profilePicture.chunk });Descubrí que usar delete() elimina tanto el fragmento como el archivo, pero debe ejecutarse en gridfsBucket . Todas las demás "soluciones" en StackOverflow usan remove() o deleteOne() en gfs .
El problema con esta solución es que la función de delete() solo funciona con BSON _id's por lo que si desea eliminar archivos según el nombre de archivo o los metadatos, entonces no funcionará.
router.delete("/files/:_id", (req, res) => { gridfsBucket = new mongoose.mongo.GridFSBucket(connection.db, { bucketName: "profilePictures", }); gridfsBucket.delete(ObjectId(req.params._id)); });