Mongoose - 如何使用预挂钩删除进行级联删除
Mongoose - How to cascade delete using pre hook remove
我有一个 moment 架构,可以关联多个评论。当某个时刻被删除时,我希望与该时刻相关的所有评论也被删除。
瞬间架构
let MomentSchema = new Schema({
body: String,
likes: [{
type: Schema.Types.ObjectId,
ref: 'User',
}],
dislikes: [{
type: Schema.Types.ObjectId,
ref: 'User',
}],
comments: [{
type: Schema.Types.ObjectId,
ref: 'Comment',
}],
author: {
type: Schema.Types.ObjectId,
ref: 'User',
},
},
{
timestamps: {createdAt: 'created_at', updatedAt: 'updated_at'},
});
MomentSchema.pre('remove', (next) => {
//What to include here to delete all the comments for this moment
});
仅供参考,评论也可以有回复,这也是评论模型,因此我还需要评论模型中的预删除挂钩吗?
评论架构
let CommentSchema = new Schema({
body: {
type: String,
required: true,
},
moment: {
type: Schema.Types.ObjectId,
ref: 'Moment',
},
author: {
type: Schema.Types.ObjectId, ref: 'User',
required: true,
},
likes: [{
type: Schema.Types.ObjectId,
ref: 'User',
}],
dislikes: [{
type: Schema.Types.ObjectId,
ref: 'User',
}],
parent: {
type: Schema.Types.ObjectId,
ref: 'Comment',
},
replies: [{
type: Schema.Types.ObjectId,
ref: 'Comment',
}],
},
{
timestamps: {createdAt: 'created_at', updatedAt: 'updated_at'},
});
API 删除:moment/:id
destroy(req, res) {
let id = req.params.id;
Moment.findOne({'_id': id}, (err, moment) => {
if (err) {
return res.status(404).json({
success: false,
status: 404,
data: {},
message: 'Failed to find moment',
});
}
moment.remove((err, moment) => {
if (err) {
return res.status(400).json({
success: false,
status: 400,
data: err,
message: 'Failed to delete moment',
});
}
return res.status(200).json({
success: true,
status: 200,
data: {},
message: 'Successfully deleted moment',
});
});
});
}
我需要在pre-hook中删除什么才能删除与该时刻相关的所有评论。此外,在预挂钩中调用 "this" 时将其删除 returns undefined.
因此,要删除所有评论 && 多级联,我必须在文档上调用 .remove 方法。将下面的代码插入 moment pre-hook remove 函数后,它将在删除 moment 之前删除评论。
此外,在删除评论之前,它会调用评论预挂钩。我可以在哪里添加代码以删除对每条评论的回复。
Comment.find({'moment': this._id})
.then((comments) => {
Promise.all(comments.forEach((comment) => comment.remove()))
.then(next());
});
这里使用了promise.all,因为我们只想删除所有评论后的那一刻
我有一个 moment 架构,可以关联多个评论。当某个时刻被删除时,我希望与该时刻相关的所有评论也被删除。
瞬间架构
let MomentSchema = new Schema({
body: String,
likes: [{
type: Schema.Types.ObjectId,
ref: 'User',
}],
dislikes: [{
type: Schema.Types.ObjectId,
ref: 'User',
}],
comments: [{
type: Schema.Types.ObjectId,
ref: 'Comment',
}],
author: {
type: Schema.Types.ObjectId,
ref: 'User',
},
},
{
timestamps: {createdAt: 'created_at', updatedAt: 'updated_at'},
});
MomentSchema.pre('remove', (next) => {
//What to include here to delete all the comments for this moment
});
仅供参考,评论也可以有回复,这也是评论模型,因此我还需要评论模型中的预删除挂钩吗?
评论架构
let CommentSchema = new Schema({
body: {
type: String,
required: true,
},
moment: {
type: Schema.Types.ObjectId,
ref: 'Moment',
},
author: {
type: Schema.Types.ObjectId, ref: 'User',
required: true,
},
likes: [{
type: Schema.Types.ObjectId,
ref: 'User',
}],
dislikes: [{
type: Schema.Types.ObjectId,
ref: 'User',
}],
parent: {
type: Schema.Types.ObjectId,
ref: 'Comment',
},
replies: [{
type: Schema.Types.ObjectId,
ref: 'Comment',
}],
},
{
timestamps: {createdAt: 'created_at', updatedAt: 'updated_at'},
});
API 删除:moment/:id
destroy(req, res) {
let id = req.params.id;
Moment.findOne({'_id': id}, (err, moment) => {
if (err) {
return res.status(404).json({
success: false,
status: 404,
data: {},
message: 'Failed to find moment',
});
}
moment.remove((err, moment) => {
if (err) {
return res.status(400).json({
success: false,
status: 400,
data: err,
message: 'Failed to delete moment',
});
}
return res.status(200).json({
success: true,
status: 200,
data: {},
message: 'Successfully deleted moment',
});
});
});
}
我需要在pre-hook中删除什么才能删除与该时刻相关的所有评论。此外,在预挂钩中调用 "this" 时将其删除 returns undefined.
因此,要删除所有评论 && 多级联,我必须在文档上调用 .remove 方法。将下面的代码插入 moment pre-hook remove 函数后,它将在删除 moment 之前删除评论。
此外,在删除评论之前,它会调用评论预挂钩。我可以在哪里添加代码以删除对每条评论的回复。
Comment.find({'moment': this._id})
.then((comments) => {
Promise.all(comments.forEach((comment) => comment.remove()))
.then(next());
});
这里使用了promise.all,因为我们只想删除所有评论后的那一刻