在Mongoose中级联样式删除

有没有办法删除Mongoose中的父项的所有子项,类似于使用MySQL的外键?

例如,在MySQL中,我将分配一个外键,并将其设置为级联删除。 因此,如果我要删除一个客户端,所有的应用程序和关联的用户也将被删除。

从顶层:

  1. 删除客户端
  2. 删除抽奖
  3. 删除提交

抽奖和提交都有一个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}); }); 

这是Mongoose 'remove' 中间件的主要用例之一。

 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()会自动调用这个中间件来清理依赖关系。

如果您的引用是以其他方式存储的,例如, client有一个submission_ids数组,那么以与接受的答案类似的方式,您可以在submissionSchema上定义以下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。