我更新了Mongoose模型,然后使用实现简单视图计数器的$inc
操作符检索:
const profile = await Profile.findOneAndUpdate({ userName }, { $inc: { viewsCount: 1 } });
Profile
架构启用了timestamps
选项。问题是updatedAt
是在viewsCount
更新期间更新的,这不是一种理想的行为。
我希望在更新updatedAt
时禁用viewsCount
更新,最好是尽可能少地执行查询。
我假设猫鼬时间戳是用预挂钩实现的。
findOneAndUpdate
如何在不更新updatedAt
的情况下增加viewsCount
?
这能通过否定时间戳挂钩的效果来实现吗?
有一些类似的问题可以解决updatedAt
更新的问题,但是解决方案并不适合这种情况。
发布于 2020-05-14 12:48:01
发布于 2019-02-19 10:44:04
在浏览了Mongoose文档之后,简单的回答似乎是“否”,如果没有设置findOneAndUpdate()
字段,就无法调用updatedAt
。如果您查看docs 这里,它会清楚地声明所有用于更新的函数(findOneAndUpdate()、update()和bulkWrite())都将$set
操作符添加到查询中以设置updatedAt
。话虽如此,你确实有另一种选择,我强烈建议。
围绕着工作
将createdAt和updatedAt字段直接添加到模型中,并去掉时间戳。当然,为您处理它真的很好,但是最后,如果您必须尝试为特定的用例更改时间戳的集合功能,那么最好自己来做。
如果您喜欢在调用updatedAt或.update()
时设置.save()
和.update()
,则始终可以编写自己的中间件来添加操作。
ProfileSchema.pre('save', function(next) {
this.createdAt = Date.now();
this.updatedAt = Date.now();
next();
});
我知道这不是想要的解决方案,但坦率地说,我发现它更有用,因为有更大的控制,更少意外的行为从猫鼬。您对自己代码的控制越多,越好。希望这能有所帮助!
https://stackoverflow.com/questions/54717199
复制