2012-03-11 40 views
5

Próbuję znaleźć najlepszy sposób śledzenia zmian na polach podczas korzystania z mongoose.js. Na przykład za każdym razem, gdy ustawione jest pole name obiektu, chcę dodać nowy wpis do historii tego obiektu (jako dokumentu osadzonego), który wygląda podobnie do { field: 'name', previous: 'foo', current: 'bar', date: '3/06/2012 9:06 am' }.Śledzenie zmian w polach za pomocą mongoose.js

Zacząłem od użycia wtyczki, która podpina .pre('save'), ale nie mogę określić, które pola zostały zmodyfikowane bez pobierania starej wartości z bazy danych i porównywania ich samemu. Wtedy pomyślałem, że mogę użyć ustawiaczy niestandardowych, ale wpadłem na ten sam problem - nie wiem, które pole zostało zmodyfikowane. Obecnie pozostaje mi zrobić coś takiego które twardych kodów nazwa pola w celu ustawiająca:

var comment = new Schema({ 
    name : { type: String, set: trackName }, 
    history : [Change] 
}); 

var trackName = function(val) { 
    var change = new Change; 
    change.field = 'name'; 
    change.previous = this.name; 
    change.current = val; 
    change.date = Date.now(); 
    this.history.push(change); 
    return val; 
} 

Ale to oznacza, że ​​muszę niestandardowy setter dla każdej nazwy pola, że ​​chcesz śledzić. Zgaduję, że musi istnieć lepszy sposób, aby to osiągnąć.

Odpowiedz

4

Wygląda na to, że brakowało "Document.modifiedPaths". Dokładnie to robi, aby określić, które pola zostały zmodyfikowane.

+3

Skąd wzięły się stare wartości tylko za pomocą modifiedPaths? –

+1

@ Totty.js Dla każdego, kto natknie się na to pytanie, mangusta obecnie nie śledzi starych wartości automatycznie, ale oto jedno rozwiązanie: https://pste.me/#/FU1Kg – helion3

+0

@ helion3 wygląda na to, że ten link jest nieaktualny –

Powiązane problemy