Jeśli szukasz „dowodu” oczekiwanego zachowania, nie szukaj dalej niż sam kod źródłowy. Szczególnie w schema.js kod> główna definicja
:
updates.$setOnInsert = {};
updates.$setOnInsert[createdAt] = now;
}
return updates;
};
this.methods.initializeTimestamps = function() {
if (createdAt && !this.get(createdAt)) {
this.set(createdAt, new Date());
}
if (updatedAt && !this.get(updatedAt)) {
this.set(updatedAt, new Date());
}
return this;
};
this.pre('findOneAndUpdate', _setTimestampsOnUpdate);
this.pre('update', _setTimestampsOnUpdate);
this.pre('updateOne', _setTimestampsOnUpdate);
this.pre('updateMany', _setTimestampsOnUpdate);
}
function _setTimestampsOnUpdate(next) {
var overwrite = this.options.overwrite;
this.update({}, genUpdates(this.getUpdate(), overwrite), {
overwrite: overwrite
});
applyTimestampsToChildren(this);
next();
}
Możesz więc zobaczyć wszystkie 'pre'
programy obsługi oprogramowania pośredniego są rejestrowane dla każdego z wariantów metody „aktualizacji” i do tego samego kodu funkcjonalnego. Wszystkie one zasadniczo modyfikują $set
operator w każdej „aktualizacji”, którą wydajesz, aby uwzględnić updatedAt
pole lub jakakolwiek nazwa przypisana do tego klucza w opcjach schematu.
Rzeczywista instrukcja wysłana z akcjami „upsert” używa $setOnInsert
dla createdAt
nazwa pola lub zmapowanej opcji ( patrz góra listy ). To działanie tylko ma zastosowanie, gdy rzeczywiście występuje „upsert”, więc dokumenty, które istnieją i są jedynie dopasowane do którejkolwiek z metod „aktualizacji”, nigdy faktycznie dotknięty przez tę wartość.
Te operatory są częścią działania MongoDB i nie mają nic wspólnego z mongoose, ale pokazany tutaj kod pokazuje, w jaki sposób mongoose „dostosowuje” twoje akcje „aktualizacji”, aby uwzględnić te dodatkowe operacje.
Dla odniesienia cała główna funkcja w schema.js
która sprawdza, co należy zastosować, obecnie zaczyna się od Linia #798 dla genUpdates()
funkcja nazywana w dolnej części wykazu pokazanego tutaj, ale górna część to kilka ostatnich wierszy tej funkcji, w których klawisze $setOnInsert
zdefiniuj.
Podsumowując, TAK, każde działanie „aktualizacji” jest celowe, aby updatedAt
mapowane pole ma aktualną datę
przypisana wartość, a także, że „aktualizacje” zostały zmodyfikowane w celu uwzględnienia $setOnInsert
działanie, które tylko ma zastosowanie, gdy nowy dokument jest tworzony w wyniku akcji "upsert" dla createdAt
mapowane pole.