2017-01-09 8 views
1

私のコレクションのすべてのサブ文書を削除します。mongooseを使用してサブ文書を削除するとエラーが返されますか?

マングーススキーマ:

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

findOneAndUpdate()方法でproductsフィールドを削除$unset演算子を使用。従来の方法では、最初に 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"}); 
     } 
    ); 
}); 

あなたは配列フィールドを維持するが、そのすべての要素を削除し、あなたはString型としてshopSchemaで「providerId」を保存しているためです

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

として$setを使用したい場合たとえそれがマングースオブジェクトであっても。 したがって、文字列型を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と連携model.findById()関数を使用している、しかし、あなたはString型の私たちproviderIdでそれをしようとしているので、それがエラーを与えている_id

+0

で動作します –

関連する問題