我对使用mongoose(使用平均堆栈)进行开发相当新,我遇到了与我当前应用程序的mongo / mongoose理解问题。我想要做的是在我的模式之间创建一个论坛风格的关系。
因此,类别架构位于根目录。在一个类别下是帖子。帖子可以包含属于它的评论。所以当我删除一个类别时我想要发生的是帖子将被删除,(没有问题),但我也想清理与删除的所有帖子相关的评论。当我的类别.pre()删除帖子时,我的帖子中的.pre()问题似乎没有被触发。
目前我的类别架构:
var mongoose = require('mongoose');
var CategorySchema = new mongoose.Schema({
categoryname: String,
categoryslug: String,
categorydescription: String,
views: {type: Number, default: 0},
created: {type: Date, default: Date.now()},
posts: [{ type: mongoose.Schema.Types.ObjectId, ref: 'Post' }]
});
CategorySchema.methods.addview = function(cb) {
this.views += 1;
this.save(cb);
};
// Middleware Remove all the Posts in the category when deleted
CategorySchema.pre('remove', function(next) {
this.model('Post').remove( { category: this._id }, next );
});
mongoose.model('Category', CategorySchema);
删除类别会删除该类别中的所有帖子。 然后我的帖子架构:
var PostSchema = new mongoose.Schema({
title: String,
postcontent: String,
author: {type: String, default: 'Developer'},
upvotes: {type: Number, default: 0},
downvotes: {type: Number, default: 0},
created: {type: Date, default: Date.now()},
views: Number,
active: {type: Boolean, default: true},
comments: [{type: mongoose.Schema.Types.ObjectId, ref: 'Comment'}],
category: {type: mongoose.Schema.Types.ObjectId, ref: 'Category'}
});
...
PostSchema.pre('remove', function(next) {
// Remove all the comments associated with the removed post
this.model('Comment').remove( { post: this._id }, next )
// Middleware Remove all the category references to the removed post
this.model('Category').update({ posts: this._id },
{ $pull: { posts: { $in: [this._id] }} } , next);
});
mongoose.model('Post', PostSchema);
删除帖子会删除与预期相关的评论。但是当我删除一个类别,并且帖子被删除时,中间件永远不会触发删除每个帖子的评论。
答案 0 :(得分:1)
如果您仍然对答案感兴趣;
您在remove(<query>)
中间件中使用Category
来删除Post
。来自mongoose文档;
注意:remove()没有查询挂钩,仅适用于文档。如果你 设置&#39;删除&#39;钩子,当你调用myDoc.remove()时会被触发, 不是在你调用MyModel.remove()时。
您需要获取帖子,然后在该文档上调用delete才能使其正常工作。