2017-02-14 7 views
0

私はThinksterのMEANスタックチュートリアル(https://thinkster.io/tutorials/mean-stack)に従っていますが、削除操作の実装方法はわかりません。MongoDB:削除された投稿のコメントをすべて削除するには?

私は現在、次のスキーマを持っている:

var PostSchema = new mongoose.Schema({ 
    title: {type: String, required: true, maxlength: 140}, 
    link: {type: String, required: true, maxlength: 300}, 
    comments: [{ type: mongoose.Schema.Types.ObjectId, ref: 'Comment' }] 
}); 

var CommentSchema = new mongoose.Schema({ 
    body: {type: String, maxlength: 200, minlength: 1}, 
    post: { type: mongoose.Schema.Types.ObjectId, ref: 'Post' } 
}); 

私はCRUD操作のための角度の工場を持っています。私はすべての関連コメントのどこかに残っている。このように投稿を削除する場合、残念ながら

// DELETE a post 
router.delete('/posts/:post', function(req, res, next) { 
    Post.remove({_id: req.params.post}, function(err, post) { 
     if (err) 
      res.send(err); 

     res.json({ message: 'Successfully deleted' });   
    }); 
}); 

o.deletePost = function(id) { 
    return $http.delete('/posts/' + id, null, {} 
    }).success(function(res){ 
    $window.location.href = '/#/home'; 
    return res.data; 
    }); 
}; 

そして、このような削除ルックスのための私のルータ:私は現在、次のファクトリメソッドで投稿を削除しますデータベース。だから、私の質問はです投稿を削除している間、その投稿に関連するコメントをすべて削除するにはどうすればいいですか?

私はGoogleに答えを求めましたが、どうにかしてMongoDBのミドルウェアを使用する必要があるようです。私が試した:

// Remove Post 
module.exports.removePost = function(id, callback){ 
    Post.findById(id, function (err, doc) { 
     if (err) {} 

     doc.remove(callback); 
    }) 
} 

//Remove comments related to post 
PostSchema.pre('remove', function(next) { 

    this.model('Comment').remove({ post: this._id }, next); 
}); 

しかし、私は私のCRUDの工場からそれを呼び出す方法を知らないので、これは、何もしません。私がしてもそれが正しいかどうかわからない。だから、どんな助けも歓迎されるだろう。 :)

+0

「正常に削除されました」というメッセージは表示されませんか? [Postman](https://www.getpostman.com/)でテストしてみましたか? – gh0st

+0

@ gh0st質問をルータの情報で更新しました。 – catfood

+0

@ gh0stメッセージが表示され、問題なく投稿を削除できます。問題は、投稿を削除すると、関連するすべてのコメントがデータベースに「浮動」しているということです。私は、関連する投稿が削除されたときにそれらを取り除きたいです。 – catfood

答えて

0

Mongooseドキュメントでremove()を呼び出すと、Mongooseミドルウェアが自動的に起動されます。上記のdeleteルートのコードは、ドキュメントの代わりにモデルのremove()(これについての会話:here)を呼び出しているため、ミドルウェアを起動しません。

私はあなたがすべての作品を持っていると思う、あなたはそれらを移動する必要があります。あなたのremovePost()機能とpre('remove')ミドルウェアからロジックを保ち、そしてあなたの削除ルートにロジックを組み込む:

// DELETE a post 
router.delete('/posts/:post', function(req, res, next) { 
    Post.findById(id, function (err, post) { 
     if (err) res.send(err); 
     post.remove(function (err, doc) { 
      if (err) res.send(err); 
      res.json({ message: 'Successfully deleted' }); 
     }); 
    }) 
}); 

私も異なり、「削除」をアプローチ。実際に文書を削除するのではなく、deletedフィールドを自分のスキーマに追加し、そのフィールドを削除時にtrueに更新します。文書を実際に削除することは意味がある場合もありますが、これは留意しておくべきことです。

+0

提案していただきありがとうございますが、動作しません。私は現在のrouter.deleteをそれに置き換えると、内部サーバーエラー500しか得られません。 – catfood

+0

私はrouter.deleteでremovePostメソッドに全く到達できないようです。メソッド(removePost)は現在、私のPostSchemaと同じファイルにあります。これは正しい場所ですか? – catfood

+0

ああ、別のファイルで使用したい場合は、関数をインポートする必要があります。しかし、そのすべての代わりに、あなたは 'removePost()'関数の厄介な部分を取り出し、その代わりに 'delete'ルートから呼び出すことができます。 –

0

誰もが二つの異なる解決策され、ここで、まさに私の質問を解決しましたか疑問だ場合には、次のように

作品最初の1、gh0stによって提案されたが、削除のために私のルータを変更しました:

// DELETE a post 
router.delete('/posts/:post', function(req, res, next) { 
    Post.remove({_id: req.params.post}, function(err, post) { 
     if (err) {res.send(err);} 

     Comment.remove({post: req.params.post}, function(err, post) { 
     if (err) {res.send(err);}     
     }); 

     res.json({ message: 'Successfully deleted' });   
    });  
}); 

// DELETE a post 
router.delete('/posts/:post', function(req, res, next) { 

    Post.findOne({ _id: req.params.post}, function (err, post) { 
     if (err) {res.send(err);} 

     post.remove(function (err) { 
     if (err) {res.send(err);} 

     res.json({ message: 'Successfully deleted' }); 
     }); 
    }); 
}); 

そしてmまで事前フックを追加することを次のように叫び声によって提案も働くもう一つは、削除のための私のルータを変更しましたyスキーマファイル:

// Remove comments related to a post 
PostSchema.pre('remove', function(next) { 
    this.model('Comment').remove({ post: this._id }, next); 
}); 
関連する問題