栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

猫鼬upsert操作是否会更新/更新默认架构值?

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

猫鼬upsert操作是否会更新/更新默认架构值?

如果您正在寻找预期行为的“证明”,那么除了源代码本身之外,别无所求。特别是在

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()
功能在此处显示的列表的底部部分中被调用,但顶部是该功能的最后几行,其中的
$setOnInsert
get
键定义。

因此,在总结,是每一个“更新”的动作是故意的

updatedAt
映射领域已经电流
Date
值分配,并且也认为,“更新”被修改为包括
$setOnInsert
其行动
只有 当一个新的文档作为的结果创建适用“ upsert”操作
createdAt



转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/484865.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号