Cascade-Stil löschen in Mongoose

Gibt es eine Möglichkeit, alle untergeordneten Elemente eines übergeordneten Elements in Mongoose zu löschen, ähnlich der Verwendung von Fremdschlüsseln von MySQL?

Zum Beispiel würde ich in MySQL einen Fremdschlüssel zuweisen und ihn beim Löschen auf kaskadieren setzen. Wenn ich also einen Client löschen würde, würden alle Anwendungen und zugehörigen Benutzer ebenfalls entfernt werden.

Von einer obersten Ebene:

  1. Löschen Sie den Client
  2. Gewinnspiele löschen
  3. Einträge löschen

Gewinnspiele und Übermittlungen haben beide ein Feld für client_id. Einreichungen haben ein Feld sowohl für die Gewinnspiel-ID als auch für die Kunden-ID.

Im Moment verwende ich den folgenden Code und ich denke, dass es einen besseren Weg geben muss.

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}); }); 

    Dies ist einer der primären Anwendungsfälle von 'remove' Middleware von Mongoose.

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

    Auf diese Weise wird beim Aufruf von client.remove() diese Middleware automatisch aufgerufen, um Abhängigkeiten zu bereinigen.

    Wenn Ihre Referenzen anders herum gespeichert sind, sagen wir, der client hat ein Array von submission_ids , dann können Sie auf submissionSchema ähnlich wie die angenommene Antwort definieren:

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

    Dadurch wird die ID der Einreichung aus den Referenzfeldern der Clients in submission.remove() .

    Hier ist ein anderer Weg, den ich gefunden habe

     submissionSchema.pre('remove', function(next) { this.model('Client').remove({ submission_ids: this._id }, next); next(); });