2012-08-10 7 views
19

Nehmen wir an, ich ein Schema wie dieses:automatisch Entfernen von Objekten auf Löschung in MongoDB Referenzierung

var Person = new Schema({ 
    name: String 
}); 

var Assignment = new Schema({ 
    name: String, 
    person: ObjectID 
}); 

Wenn ich eine Person löschen, gibt es noch verwaiste Zuweisungen werden kann links, dass eine Person verweisen, die nicht vorhanden ist, die erzeugt überflüssige Unordnung in der Datenbank.

Gibt es eine einfache Möglichkeit sicherzustellen, dass beim Löschen einer Person auch alle entsprechenden Verweise auf diese Person gelöscht werden?

Antwort

26

Sie können Ihre eigenen 'remove' Mongoose middleware auf dem Person Schema hinzufügen, um diese Person aus allen anderen Dokumenten zu entfernen, die darauf verweisen. In Ihrer Middleware-Funktion ist this das Person Dokument, das entfernt wird.

Person.pre('remove', function(next) { 
    // Remove all the assignment docs that reference the removed person. 
    this.model('Assignment').remove({ person: this._id }, next); 
}); 
+1

Was ist, wenn es ein tiefer verschachteltes Array von Objekt-IDs enthält? wie 'data: {persons: [{ObjectID}]}'? – vhflat

+0

@vhflat Wahrscheinlich am besten, um eine neue Frage darüber mit all den Besonderheiten zu posten. – JohnnyHK

+0

@JohnnyHK, aber was ist mit Nebenläufigkeit? Was passiert, wenn eine Aufgabe erstellt wird, während die Person gelöscht wird? Ich habe versucht, dieses Problem in meiner Antwort auf diese Frage http://stackoverflow.com/q/42521550 zu lösen, aber ich denke, dass es einen besseren Weg geben muss! Können Sie es bitte überprüfen? –

8

Wenn mit "einfach" Sie "eingebaut" meinen, dann nein. MongoDB ist schließlich keine relationale Datenbank. Sie müssen Ihren eigenen Reinigungsmechanismus implementieren.

0

können Sie Soft-Löschen verwenden. Löschen Sie keine Person aus Personensammlung, sondern verwenden Sie das boolesche Flag isDelete auf true.

Verwandte Themen