在猫鼬中删除级联样式

时间:2013-01-15 22:59:29

标签: mongodb mongoose

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

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

从顶层:

  1. 删除客户
  2. 删除抽奖活动
  3. 删除提交
  4. 抽奖和提交都有一个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});
    
    });
    

3 个答案:

答案 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();
});