Empresas
Empleos
  • Sobre nosotros
  • Soluciones
    • Publicación de vacantes
      Publica tu vacante y recibe candidatos calificados en 48h.
    • Evaluación de candidatos
      500+ pruebas técnicas y psicológicas, más anti-fraude.
    • Headhunting
      Búsqueda ejecutiva a la medida de principio a fin.
    • Nómina + EOR
      Dispersión de nómina y EOR en más de 15 países de LATAM.
  • Precios
  • Empleos

0

81
Vistas
¿Eliminar subdocumentos usando el error de devolución de mongoose?

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"
over 4 years ago · Santiago Trujillo
2 Respuestas
Responde la pregunta

0

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"}); } ); });
over 4 years ago · Santiago Trujillo Denunciar

0

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

over 4 years ago · Santiago Trujillo Denunciar
Responde la pregunta
Encuentra empleos remotos

¡Descubre la nueva forma de encontrar empleo!

Top de empleos
Top categorías de empleo
Empresas
Publicar vacante Precios Comercial
Legal
Términos y condiciones Política de privacidad
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Recomiéndame algunas ofertas
Necesito ayuda