如果您正在寻找预期行为的“证明”,那么除了源代码本身之外,别无所求。特别是在
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'中间件处理程序都已为每个“
update”方法变体注册并注册到相同的功能代码。所有这些本质上都会
$set在您发出的任何“更新”中修改运算符,以包括该
updatedAt字段,或您在模式选项中映射到该键的任何名称。
通过“
upsert”操作发送的实际语句
$setOnInsert用于
createdAt字段或映射的选项名称(请参见清单顶部)。此操作
仅 在“ upsert”实际发生 时才 适用,因此该值实际上 不会 触及存在且仅与任何“ update”方法匹配的文档。
这些运算符是MongoDB工作方式的一部分,与Mongoose无关,但此处显示的代码显示了Mongoose如何“调整”您的“
update”操作以包括这些附加操作。
作为参考,整个主要功能(
schema.js目前在其中列出了该功能的适用范围)始于第798行,该
genUpdates()功能在此处显示的列表的底部部分中被调用,但顶部是该功能的最后几行,其中的
$setOnInsertget
键定义。
因此,在总结,是每一个“更新”的动作是故意的
updatedAt映射领域已经电流
Date值分配,并且也认为,“更新”被修改为包括
$setOnInsert其行动
只有 当一个新的文档作为的结果创建适用“ upsert”操作
createdAt。



