Om du letar efter "bevis" för det förväntade beteendet, leta inte längre än till själva källkoden. Särskilt inom
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å där kan du se alla 'pre'
mellanvaruhanterare som registreras för var och en av "uppdaterings"-metodens varianter och till samma funktionskod. Alla dessa modifierar i huvudsak $set
operatorn i alla "uppdateringar" du utfärdar för att inkludera updatedAt
fältet, eller vilket namn du nu mappade till den nyckeln i schemaalternativen.
Det faktiska uttalandet som skickas med "upsert"-åtgärder använder $setOnInsert
för createdAt
fält eller mappat alternativnamn (se överst i listan). Denna åtgärd endast gäller när en "upsert" faktiskt inträffar, så dokument som finns och bara matchar någon av "upsert"-metoderna är aldrig faktiskt berört av detta värde.
Dessa operatörer är en del av hur MongoDB fungerar och har egentligen inte med mongoose att göra, men koden som visas här visar hur mongoose "justerar" dina "uppdaterings"-åtgärder för att inkludera dessa ytterligare operationer.
För referens hela huvudfunktionen i schema.js
som räknar ut vad som ska tillämpas börjar just nu på Line #798">Line /a> för genUpdates()
funktion som kallas i den nedre delen av listan som visas här men den övre delen är de sista raderna av den funktionen där nycklarna till $setOnInsert
bli definierad.
Så sammanfattningsvis, JA varje "uppdatering"-åtgärd är avsiktlig att updatedAt
mappat fält har det aktuella Datum
värde som tilldelas, och även att "uppdateringarna" är modifierade för att inkludera $setOnInsert
åtgärd som endast gäller när ett nytt dokument skapas som ett resultat av en "upsert"-åtgärd för createdAt
mappat fält.