Als u op zoek bent naar "bewijs" van het verwachte gedrag, zoek dan niet verder dan de broncode zelf. Met name binnen de schema.js
hoofddefinitie
:
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();
}
Dus daar kun je alle 'pre'
. zien middleware-handlers worden geregistreerd voor elk van de "update"-methodevarianten en voor dezelfde functionele code. Deze wijzigen in wezen de $set
operator in elke "update" die u uitgeeft om de updatedAt
. op te nemen veld, of welke naam je ook hebt toegewezen aan die sleutel in de schema-opties.
De feitelijke instructie die wordt verzonden met "upsert" -acties gebruikt $setOnInsert
voor de createdAt
veld of toegewezen optienaam (zie bovenaan de lijst). Deze actie alleen is van toepassing wanneer een "upsert" daadwerkelijk optreedt, dus documenten die bestaan en slechts overeenkomen met een van de "update"-methoden zijn nooit daadwerkelijk geraakt door deze waarde.
Die operators maken deel uit van hoe MongoDB werkt en hebben niet echt met mangoest te maken, maar de hier getoonde code laat zien hoe mangoest uw "update" -acties "aanpast" om deze extra bewerkingen op te nemen.
Ter referentie de hele hoofdfunctie in schema.js
die uitwerkt wat u momenteel moet toepassen, begint bij regel #798 voor de genUpdates()
functie zoals aangeroepen in het onderste deel van de lijst die hier wordt getoond, maar het bovenste deel is de laatste paar regels van die functie waar de toetsen van $setOnInsert
word gedefinieerd.
Dus kort samengevat, JA, elke "update" -actie is opzettelijk dat de updatedAt
toegewezen veld heeft de huidige Date
waarde toegewezen, en ook dat de "updates" zijn gewijzigd om de $setOnInsert
actie die alleen is van toepassing wanneer een nieuw document wordt gemaakt als resultaat van een "upsert" -actie voor de createdAt
toegewezen veld.