Node.js Mongoose upsert操作是否更新/更新默认架构值?
猫鼬模式:Node.js Mongoose upsert操作是否更新/更新默认架构值?,node.js,mongodb,mongoose,mongoose-schema,Node.js,Mongodb,Mongoose,Mongoose Schema,猫鼬模式: new Schema({ ... createDate: { type: Date, default: Date.now }, updateDate: { type: Date, default: Date.now } }); 上插操作: const upsertDoc = { ... } Model.update({ key: 123 }, upsertDoc, { upsert: true }) 当我使用update或findOneAndUpdate
new Schema({
...
createDate: { type: Date, default: Date.now },
updateDate: { type: Date, default: Date.now }
});
上插操作:
const upsertDoc = {
...
}
Model.update({ key: 123 }, upsertDoc, { upsert: true })
当我使用update
或findOneAndUpdate
向上插入时,无论插入或更新文档,默认模式值createDate
和updatedatedate
始终会被更新。当我使用$set
时也是如此(当然我不会传递日期)
如果这是一种预期的行为,我似乎找不到任何线索。我希望只在插入时添加日期,而不更新日期,除非明确设置 好吧,我一直建议使用mongoose提供的和推荐的方法来管理
createdAt
和updatedAt
。只需将timeStamp:true
作为模式选项传递即可
这始终是一个最佳实践,让您不必担心此类行为
我使用它,使用update
或findOneAndUpdate
时,我从未发现时间戳有问题
下面是你如何使用它
new Schema({
... //Your schema
},{ timestamps: true})
嗯,我总是建议使用提供的和推荐的方法来管理mongoose提供的
createdAt
和updatedAt
。只需将timeStamp:true
作为模式选项传递即可
这始终是一个最佳实践,让您不必担心此类行为
我使用它,使用update
或findOneAndUpdate
时,我从未发现时间戳有问题
下面是你如何使用它
new Schema({
... //Your schema
},{ timestamps: true})
如果您正在寻找预期行为的“证据”,那么只需查看源代码本身即可。特别是在以下方面:
因此,您可以看到所有的'pre'
中间件处理程序都为每个“update”方法变体和相同的功能代码注册。这些基本上都会修改您发出的任何“更新”中的运算符,以包括updatedAt
字段,或者在模式选项中映射到该键的任何名称
与“upsert”操作一起发送的实际语句用于createdAt
字段或映射选项名称(请参见列表顶部)。此操作仅在实际发生“upsert”时应用,因此存在的文档仅与任何“update”方法匹配,因此该值不会实际触及该文档
这些操作符是MongoDB工作原理的一部分,实际上与mongoose无关,但这里显示的代码显示了mongoose如何“调整”您的“更新”操作,以便包含这些附加操作
请参考schema.js
中的整个主函数,该函数计算出当前应用于genUpdates()
函数的内容,如清单底部所示,但顶部是该函数的最后几行,其中定义了
总之,是的,每个“更新”操作都是有意的,即updatedAt
映射字段分配了当前的Date
值,并且修改“更新”以包括仅在作为“upsert”结果创建新文档时应用的操作createdAt
mapped字段的操作。如果要查找预期行为的“证据”,请只查看源代码本身。特别是在以下方面:
因此,您可以看到所有的'pre'
中间件处理程序都为每个“update”方法变体和相同的功能代码注册。这些基本上都会修改您发出的任何“更新”中的运算符,以包括updatedAt
字段,或者在模式选项中映射到该键的任何名称
与“upsert”操作一起发送的实际语句用于createdAt
字段或映射选项名称(请参见列表顶部)。此操作仅在实际发生“upsert”时应用,因此存在的文档仅与任何“update”方法匹配,因此该值不会实际触及该文档
这些操作符是MongoDB工作原理的一部分,实际上与mongoose无关,但这里显示的代码显示了mongoose如何“调整”您的“更新”操作,以便包含这些附加操作
请参考schema.js
中的整个主函数,该函数计算出当前应用于genUpdates()
函数的内容,如清单底部所示,但顶部是该函数的最后几行,其中定义了
总之,是的,每个“更新”操作都是有意的,即
updatedAt
映射字段分配了当前的Date
值,并且修改“更新”以包括仅在作为“upsert”结果创建新文档时应用的操作createdAt
映射字段的操作。Hi Talha Awan-我能请您澄清一些事情吗?你在你的模式中使用了吗?@VinceBowdren,没有。嗨,Talha Awan-我能请你澄清一些事情吗?“你在你的模式中使用了吗?”@VinceBowdren,没有。像往常一样,彻底而深入的回答。”。非常感谢。嗨,尼尔;我可能误解了,但看起来您所描述的代码与有关,但问题是,操作方式不同-是吗?@VinceBowdren我认为这里的重点是理解$set
和$setOnInsert
之间的区别。相信“猫鼬魔法”会让OP和其他很多人陷入各种各样的麻烦,因为他们不明白这个“简单选项设置”到底在做什么。如果你花时间向人们解释,那么他们可能会真正理解为什么要这样做。除此之外,OP刚刚花了100个代表。他们应该得到比RTFM更好的响应吗?像往常一样,他们应该得到彻底和深入的回答。非常感谢。嗨,尼尔;我可能误解了