Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/mongodb/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Node.js Mongoose upsert操作是否更新/更新默认架构值?_Node.js_Mongodb_Mongoose_Mongoose Schema - Fatal编程技术网

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更好的响应吗?像往常一样,他们应该得到彻底和深入的回答。非常感谢。嗨,尼尔;我可能误解了