2017-01-09 99 views
1

我想刪除我的集合的所有子文檔。使用貓鼬刪除子文檔返回錯誤?

貓鼬模式:

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

我已經存儲了一個大部分集合內的數據,我需要刪除所有的產品(即整個pdtSchema數據)。

代碼:

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

錯誤:

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

回答

1

使用$unset操作者這將刪除products字段與findOneAndUpdate()方法。使用第一個 的傳統方法檢索文檔findById()只適用於有效的ObjectId,在您的情況下,您只提供非ObjectId字符串,因此是錯誤。

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

如果你想保持陣列領域,但刪除它的所有元素,使用$set作爲

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

這是因爲你在shopSchema減排「providerId」爲String類型,儘管它是貓鼬的對象。 因此,將字符串類型與mognoose ObjectId類型進行比較會導致投射錯誤。

而是做到這一點,

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

但是,我認爲,如果providerId指店鋪ID,那麼就應該只_id。

model.findById()的作品與_id

+0

那是因爲你使用model.findById()函數,該函數_id工作給了一個錯誤,但是你用providerId嘗試它其中我們String類型的 –