【发布时间】:2017-07-03 10:18:16
【问题描述】:
我正在关注 Thinkster 的 MEAN 堆栈教程 (https://thinkster.io/tutorials/mean-stack),它没有说明应该如何实现删除操作。
我目前有以下架构:
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 操作的 Angular 工厂。我目前使用以下工厂方法删除帖子:
o.deletePost = function(id) {
return $http.delete('/posts/' + id, null, {}
}).success(function(res){
$window.location.href = '/#/home';
return res.data;
});
};
我的删除路由器如下所示:
// 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' });
});
});
不幸的是,当我删除这样的帖子时,任何相关的 cmets 都会留在数据库中的某个位置。所以,我的问题是如何在删除帖子的同时删除与帖子相关的所有 cmets?
我已尝试通过 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 工厂调用它。即使我这样做也不知道是否正确。因此,欢迎任何帮助。 :)
【问题讨论】:
-
您甚至没有收到“已成功删除”的消息吗?您是否尝试过使用 Postman 对其进行测试?
-
@gh0st 我用路由器信息更新了我的问题。
-
@gh0st 我收到了消息,我可以毫无问题地删除帖子。问题是当我删除一个帖子时,所有相关的 cmets 都留在数据库中“浮动”。当相关帖子被删除时,我想摆脱它们。
-
在您的
Post.remove();调用Comments.remove();并传入与之关联的帖子的ID。 -
@gh0st 谢谢,就像一个魅力! :) 但我想知道这是否是删除引用的首选方法,而不是创建用于删除的自定义模式方法。有什么想法吗?
标签: angularjs mongodb mongoose mean-stack