56

MySQLの外部キーを使用するのと同様に、Mongooseで親のすべての子を削除する方法はありますか?

たとえば、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});

});
4

4 に答える 4

131

これは、Mongoose の'remove' ミドルウェアの主な使用例の 1 つです。

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()このミドルウェアを呼び出すと、依存関係をクリーンアップするために自動的に呼び出されます。

于 2013-01-16T00:04:38.743 に答える