Quiero eliminar todos los subdocumentos de mi colección.
esquema de mangosta:
//productSchema var pdtSchema = new Schema({ "productId" : {type : String}, "product" : {type : String}, "item no" : {type : String}, }); var shopSchema = new Schema({ "providerId" : {type : String}, "provider" : {type : String}, "products" : [pdtSchema] }, { collection:"shopdetails" }); module.exports.Shops = mongoose.model('Shops',shopSchema); module.exports.Products = mongoose.model('Products',pdtSchema); He almacenado una gran cantidad de datos dentro de la colección y necesito eliminar todos los productos (esos son todos los datos de pdtSchema ).
código:
router.post('/delete',function (req,res) { var providerId = req.body.providerId; model.Shops.findById({"providerId" : providerId},function(err, doc) { console.log(doc.products) // returns whole products here... doc.products.remove(); doc.save(function(err,data){ res.json({"msg":"deleted"}); }); }); });error:
(node:16351) UnhandledPromiseRejectionWarning: Unhandled promise rejection (rejection id: 1): ValidationError: CastError: Cast to ObjectID failed for value "[Function]" at path "_id"Utilice el operador $unset que elimina el campo de products con el método findOneAndUpdate() . Usar el enfoque tradicional de recuperar primero el documento con findById() solo funciona con un ObjectId válido, en su caso solo está proporcionando una cadena que no es ObjectId , de ahí el error.
router.post('/delete',function (req,res) { var providerId = req.body.providerId; model.Shops.findOneAndUpdate( { "providerId": providerId }, { "$unset": { "products": "" } }, { "new": true } function(err, doc) { console.log(doc) // returns modified doc here... res.json({"msg": "Field deleted"}); } ); }); Si desea mantener el campo de matriz pero eliminar todos sus elementos, use $set como
router.post('/delete',function (req,res) { var providerId = req.body.providerId; model.Shops.findOneAndUpdate( { "providerId": providerId }, { "$set": { "products": [] } }, { "new": true } function(err, doc) { console.log(doc) // returns doc with empty products here... res.json({"msg": "Products deleted"}); } ); });Esto se debe a que está guardando "providerId" en shopSchema como tipo String, aunque es un objeto mangosta. Por lo tanto, comparar un tipo de cadena con un tipo de ObjectId mognoose da un error de conversión.
En su lugar haz esto,
var shopSchema = new Schema({ "providerId" : { type : Schema.ObjectId ref : schema which they are a reference to}, "provider" : {type : String}, "products" : [pdtSchema] }, { collection:"shopdetails" }); Pero, creo que si providerId se refiere a una ID de tienda, entonces debería ser solo _id .
model.findById() funciona con _id