2017-01-09 2 views
1

Ich möchte alle Unterdokumente meiner Sammlung löschen.Löschen von Filialdokumenten mit Mongoose-Rückgabefehler?

Mungo Schema:

//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); 

Ich habe einen Großteil der Daten in der Sammlung gespeichert und ich brauche alle Produkte zu löschen (dh die ganze pdtSchema Daten).

Code:

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"}); 
    }); 
    }); 
}); 

Fehler:

(node:16351) UnhandledPromiseRejectionWarning: Unhandled promise rejection (rejection id: 1): ValidationError: CastError: Cast to ObjectID failed for value "[Function]" at path "_id" 

Antwort

1

Verwenden der $unset Operator, der die products Feld mit dem findOneAndUpdate() Methode löscht. Mit dem traditionellen Ansatz der ersten Abruf des Dokuments mit findById() funktioniert nur mit einer gültigen ObjectId, in Ihrem Fall bieten Sie nur eine nicht ObjectId Zeichenfolge, daher der Fehler.

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"}); 
     } 
    ); 
}); 

Wenn Sie das Array-Feld zu halten, aber alle seine Elemente entfernen, verwenden $set als

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"}); 
     } 
    ); 
}); 
1

Das ist, weil Sie "ProviderID" in shopSchema als Typ String sparen , obwohl es ein Mungo-Objekt ist. Wenn Sie also einen String-Typ mit einem Mognoose-ObjectId-Typ vergleichen, erhalten Sie einen Cast-Fehler.

Statt dies tun,

var shopSchema = new Schema({ 
     "providerId" : { 
       type : Schema.ObjectId 
       ref : schema which they are a reference to}, 
     "provider"  : {type : String}, 
     "products"  : [pdtSchema] 
    },{collection:"shopdetails"}); 

Aber ich denke, wenn ProviderID zu einem Geschäft bezieht sich Id, dann sollte es nur _ID werden.

model.findById() arbeitet mit _id

+0

es ein Fehler ist zu geben, weil Sie model.findById() Funktion verwenden, die mit _id funktioniert, aber Sie versuchen, es mit ProviderID die uns vom Typ String –

Verwandte Themen