Hvis du leder efter "bevis" for den forventede adfærd, så led ikke længere end selve kildekoden. Især inden for
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();
}
Så der kan du se alle 'pre'
middleware-handlere, der registreres for hver af "opdaterings"-metodevarianterne og til den samme funktionelle kode. Disse modificerer alle i det væsentlige $set
operatør i enhver "opdatering" du udsteder for at inkludere updatedAt
felt, eller et hvilket som helst navn du tilknyttede den nøgle i skemaindstillingerne.
Den faktiske erklæring, der sendes med "upsert"-handlinger, bruger $setOnInsert
for createdAt
felt eller kortlagt valgmulighedsnavn (se toppen af listen). Denne handling kun gælder, når en "upsert" faktisk forekommer, så dokumenter, der eksisterer og kun matcher nogen af "opdatering"-metoderne, er aldrig faktisk berørt af denne værdi.
Disse operatører er en del af, hvordan MongoDB fungerer og har ikke rigtig med mongoose at gøre, men koden vist her viser, hvordan mongoose "justerer" dine "opdaterings"-handlinger for at inkludere disse yderligere operationer.
Til reference hele hovedfunktionen i schema.js
som finder ud af, hvad der skal ansøges, begynder i øjeblikket på Line /a> for genUpdates()
funktion som kaldet i den nederste del af listen vist her, men den øverste del er de sidste par linjer af den funktion, hvor tasterne til $setOnInsert
få defineret.
Så sammenfattende, JA hver "opdatering"-handling er bevidst, at updatedAt
tilknyttede felt har den aktuelle Dato
værdi, der er tildelt, og også at "opdateringerne" er ændret til at inkludere $setOnInsert
handling som kun gælder, når et nyt dokument oprettes som et resultat af en "upsert"-handling for createdAt
kortlagt felt.