Nie mogę zrozumieć, dlaczego to jest zachowanie i polubię jakieś wyjaśnienie.
Moim celem jest aktualizacja jakiegoś dokumentu. ponieważ nadal chcę używać walidatora mangozy, a następnie zamiast korzystać z polecenia aktualizacji, najpierw otrzymuję dokument, a następnie używam na nim zapisu, więc w ten sposób mogę nadal mieć sprawdzanie poprawności.
to jest mój model:
var JobSchema = new Schema({
_id: {type: Schema.Types.ObjectId, required: true},
_user: { type: Schema.Types.ObjectId, ref: "User", required: true},
data: {type: Object, required: true},
status: {type: String, required: true}
}, {
strict: true,
minimize: false
});
kiedy wykonuję tę technikę samodzielnie, aby zaktualizować dokument, aktualizuję obiekt danych w następujący sposób:
_.extend(doc.data, newData);
ale nowe dane nie zostaną zapisane.
jeśli zamiast tego robię to w ten sposób:
var lastData = doc.data;
doc.data = data;
_.extend(doc.data, lastData);
wtedy zadziała.
jedynym wyjaśnieniem, jakie widzę, jest to, że próba zmiany istniejącego odwołania do obiektu nie będzie działać, ale próba zapisania nowego obiektu działa.
Dlaczego tak się zachowuje?
Odpowiedzi:
4 dla odpowiedzi № 1Bo data
jest zdefiniowany typem Object
, Mongoose wykrywa zmiany tylko wtedy, gdy go nadpisujesz, przypisując mu wartość. Gdy wprowadzasz zmiany w polach, musisz powiadomić Mongoose o zmianie, dzwoniąc markModified
:
_.extend(doc.data, newData);
doc.markModified("data");
Możesz też mieć extend
utwórz nowy obiekt, który łączy oba doc.data
i newData
, abyś mógł przypisać jego wynik do doc.data
i uruchom wykrywanie zmian:
doc.data = _.extend({}, doc.data, newData);
extend
stosuje każdy obiekt w porządku, tak newData
ma pierwszeństwo.