2012-08-10 10 views
19

Załóżmy Mam schemat takiego:Automatyczne usuwanie przedstawieniu przedmiotów na delecji w MongoDB

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

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

jeśli usunę osobę, nie może jeszcze zostać osierocone przypisania lewo, że odniesienie do osoby, która nie istnieje, co tworzy zbędny bałagan w bazie danych.

Czy istnieje prosty sposób na zapewnienie, że po usunięciu osoby wszystkie odpowiednie odniesienia do tej osoby również zostaną usunięte?

Odpowiedz

26

Możesz dodać własną 'remove' Mongoose middleware na schemacie Person, aby usunąć tę osobę ze wszystkich innych dokumentów, które ją odwołują. W funkcji oprogramowania pośredniego this jest usuwany dokument Person.

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

co, jeśli zawiera ona zagnieżdżoną tablicę identyfikatorów obiektów? jak 'dane: {persons: [{ObjectID}]}'? – vhflat

+0

@vhflat Prawdopodobnie najlepiej zamieścić nowe pytanie na ten temat ze wszystkimi szczegółami. – JohnnyHK

+0

@JohnnyHK, ale co ze współbieżnością? Co się stanie, jeśli zadanie zostanie utworzone, gdy osoba zostanie usunięta? Próbowałem rozwiązać ten problem w mojej odpowiedzi na to pytanie http://stackoverflow.com/q/42521550, ale czuję, że musi być lepszy sposób! Czy możesz to sprawdzić? –

8

Jeśli przez "prosty" rozumiesz "wbudowany", to nie. MongoDB w końcu nie jest relacyjną bazą danych. Musisz wdrożyć własny mechanizm czyszczenia.

0

można użyć funkcji miękkiego usuwania. Nie usuwaj osób z kolekcji osób zamiast używać flagi boolean isDelete do wartości true.

Powiązane problemy