Angularjs MongoDB:如何删除已删除帖子的所有评论?

Angularjs MongoDB:如何删除已删除帖子的所有评论?,angularjs,mongodb,mongoose,mean-stack,Angularjs,Mongodb,Mongoose,Mean Stack,我遵循Thinkster的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

我遵循Thinkster的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' }
});
我有一个用于积垢处理的角度工厂。我目前使用以下工厂方法删除帖子:

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' });        
    });
});
不幸的是,当我删除这样的帖子时,任何相关的评论都会留在数据库的某个地方。因此,我的问题是在删除一篇文章时,我如何删除与该文章相关的所有评论?

我试着在谷歌上搜索答案,似乎我应该使用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);
});

但这没有任何作用,因为我不知道如何从我的积垢工厂调用它。即使我这样做了,我也不知道这是否正确。因此,欢迎任何帮助。:)

Mongoose中间件将在您对Mongoose文档调用
remove()
时自动触发。上面的
delete
路由中的代码不会触发中间件,因为它在模型上而不是在文档上调用
remove()
(关于此的对话)

我认为你拥有所有的碎片,你只需要移动它们。保留
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
。在某些情况下,删除文档是有意义的,但这需要记住。

如果有人想知道到底是什么解决了我的问题,这里有两种不同的解决方案:

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' });
      });
    });
});
holla建议的第二个同样有效的方法是将我的路由器更改为delete,如下所示:

// 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' });
      });
    });
});
然后将预挂钩添加到我的架构文件:

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

您甚至没有收到“已成功删除”消息吗?你试过用吗?@gh0st我用路由器信息更新了我的问题。@gh0st我收到了消息,我可以毫无问题地删除帖子。问题是,当我删除一篇文章时,所有相关的评论都会在数据库中“浮动”。我想在相关帖子被删除时将其删除。在您的
post.remove()之后调用
Comments.remove()传递与之关联的帖子的id。@gh0st谢谢,效果很好!:)但我想知道这是否是删除引用的首选方法,而不是创建用于删除的自定义模式方法。有什么想法吗?谢谢你的建议,但它不起作用。如果替换当前的router.delete,我只会收到一个内部服务器错误500。似乎我根本无法使用router.delete访问removePost方法。方法(removePost)当前与我的PostSchema位于同一文件中。这是它的正确位置吗?哦,好的,如果你想在另一个文件中使用这个函数,你必须导入它。但是,你不需要这些,你只需要从
delete
路径调用
removePost()?如果我同意你的建议,将
removePost()
的内容包括在我的
delete
路径中,我应该将
PostSchema.pre
挂起放在哪里?在my
PostSchema
所在的同一文件中?是的,您可以将预挂钩添加到与模式定义相同的文件中。查看节点以获取有关需要模块的信息