Ако търсите "доказателство" за очакваното поведение, тогава не търсете повече от самия изходен код. По-специално в рамките на schema.jsкод> основна дефиниция
:
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();
}
Така че там можете да видите всички „pre“
манипулатори на междинен софтуер, регистрирани за всеки от вариантите на метода за "актуализация" и към един и същ функционален код. Всички те по същество променят $set
във всяка „актуализация“, която издавате, за да включите updatedAt
или каквото и да е име, което сте присвоили на този ключ в опциите на схемата.
Действителното изявление, изпратено с действията "upsert", използва $setOnInsertкод>
за createdAt
име на поле или нанесена опция (вижте горната част на списъка). Само това действиена се прилага, когато действително се появи „upsert“, така че документите, които съществуват и са просто съвпадения за който и да е от методите за „актуализация“, са никога действително докоснати от тази стойност.
Тези оператори са част от начина, по който работи MongoDB и нямат нищо общо с mongoose, но кодът, показан тук, показва как mongoose „настройва“ вашите действия за „актуализация“, за да включи тези допълнителни операции.
За справка цялата основна функция в schema.js
който определя какво да се приложи в момента, започва от Ред #798 за genUpdates()
функция, както се извиква в долната част на списъка, показан тук, но горната част са последните няколко реда на тази функция, където са ключовете на $setOnInsert
дефинирайте.
Така че в обобщение, ДА всяко действие „актуализация“ е умишлено, че updatedAt
картографираното поле има текущата Дата
присвоена стойност, както и че „актуализациите“ са модифицирани, за да включват $setOnInsert
действие койсамо се прилага, когато е създаден нов документ в резултат на действие "upsert" за createdAt
картографирано поле.