首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >防止updatedAt在猫鼬findOneAndUpdate中的变化

防止updatedAt在猫鼬findOneAndUpdate中的变化
EN

Stack Overflow用户
提问于 2019-02-15 21:19:02
回答 2查看 4.7K关注 0票数 17

我更新了Mongoose模型,然后使用实现简单视图计数器的$inc操作符检索:

代码语言:javascript
代码运行次数:0
运行
复制
const profile = await Profile.findOneAndUpdate({ userName }, { $inc: { viewsCount: 1 } });

Profile架构启用了timestamps选项。问题是updatedAt是在viewsCount更新期间更新的,这不是一种理想的行为。

我希望在更新updatedAt时禁用viewsCount更新,最好是尽可能少地执行查询。

我假设猫鼬时间戳是用预挂钩实现的。

findOneAndUpdate如何在不更新updatedAt的情况下增加viewsCount

这能通过否定时间戳挂钩的效果来实现吗?

有一些类似的问题可以解决updatedAt更新的问题,但是解决方案并不适合这种情况。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2020-05-14 20:48:01

猫鼬5.9.3开始,您可以将第三个参数设置为{ timestamps: false }

来自文档

如果已启用options.timestamps=null布尔值,则跳过此更新的时间戳。请注意,这允许您覆盖时间戳。如果没有设置架构级时间戳,则不执行任何操作。

票数 18
EN

Stack Overflow用户

发布于 2019-02-19 18:44:04

在浏览了Mongoose文档之后,简单的回答似乎是“否”,如果没有设置findOneAndUpdate()字段,就无法调用updatedAt。如果您查看docs 这里,它会清楚地声明所有用于更新的函数(findOneAndUpdate()、update()和bulkWrite())都将$set操作符添加到查询中以设置updatedAt。话虽如此,你确实有另一种选择,我强烈建议。

围绕着工作

将createdAt和updatedAt字段直接添加到模型中,并去掉时间戳。当然,为您处理它真的很好,但是最后,如果您必须尝试为特定的用例更改时间戳的集合功能,那么最好自己来做。

如果您喜欢在调用updatedAt或.update()时设置.save().update(),则始终可以编写自己的中间件来添加操作。

代码语言:javascript
代码运行次数:0
运行
复制
ProfileSchema.pre('save', function(next) {
  this.createdAt = Date.now();
  this.updatedAt = Date.now();
  next();
});

我知道这不是想要的解决方案,但坦率地说,我发现它更有用,因为有更大的控制,更少意外的行为从猫鼬。您对自己代码的控制越多,越好。希望这能有所帮助!

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/54717199

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档