/ / Mongoose save z istniejącym dokumentem nie zastąpi tego samego odwołania do obiektu - node.js, mongodb, mongoose

Mongoose save z istniejącym dokumentem nie zastąpi tego samego odwołania do obiektu - node.js, mongodb, mongoose

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 № 1

Bo 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.