有没有办法删除Mongoose中父级的所有子级,类似于使用MySQL的外键?
例如,在MySQL中我会分配一个外键并将其设置为在删除时级联。因此,如果我要删除客户端,所有应用程序和关联用户也将被删除。
从顶层:
抽奖和提交都有一个client_id字段。提交的字段包含sweepstakes_id和client_id。
现在,我正在使用以下代码,我觉得必须有更好的方法。
Client.findById(req.params.client_id, function(err, client) {
if (err)
return next(new restify.InternalError(err));
else if (!client)
return next(new restify.ResourceNotFoundError('The resource you requested could not be found.'));
// find and remove all associated sweepstakes
Sweepstakes.find({client_id: client._id}).remove();
// find and remove all submissions
Submission.find({client_id: client._id}).remove();
client.remove();
res.send({id: req.params.client_id});
});
答案 0 :(得分:93)
这是Mongoose的'remove'
middleware的主要用例之一。
clientSchema.pre('remove', function(next) {
// 'this' is the client being removed. Provide callbacks here if you want
// to be notified of the calls' result.
Sweepstakes.remove({client_id: this._id}).exec();
Submission.remove({client_id: this._id}).exec();
next();
});
这样,当您调用client.remove()
时,会自动调用此中间件来清除依赖项。
答案 1 :(得分:7)
如果您的引用以其他方式存储,例如,client
的数组为submission_ids
,则以与接受的答案类似的方式,您可以在submissionSchema
上定义以下内容:
submissionSchema.pre('remove', function(next) {
Client.update(
{ submission_ids : this._id},
{ $pull: { submission_ids: this._id } },
{ multi: true }) //if reference exists in multiple documents
.exec();
next();
});
将从submission.remove()
上的客户' 参考数组中删除提交 ID。
答案 2 :(得分:1)
这是我找到的另一种方式
submissionSchema.pre('remove', function(next) {
this.model('Client').remove({ submission_ids: this._id }, next);
next();
});