我更新了Mongoose模型,然后使用$inc实现简单视图计数器的运算符检索:
const profile = await Profile.findOneAndUpdate({ userName }, { $inc: { viewsCount: 1 } });
Run Code Online (Sandbox Code Playgroud)
Profileschema已timestamps启用选项.问题是updatedAt在更新期间viewsCount更新,这不是理想的行为.
我想在updatedAt更新时禁用viewsCount更新,最好是尽可能少地进行查询.
我假设Mongoose时间戳是通过预挂钩实现的.
如何findOneAndUpdate增加viewsCount而不更新updatedAt?
可以通过否定时间戳挂钩的效果来完成吗?
有类似的问题可以解决updatedAt更新问题,但解决方案不适合这种情况.
小智 10
从mongoose 5.9.3开始,您可以将第三个参数设置为{ timestamps: false }.
从文档:
[options.timestamps=null] «Boolean» 如果设置为 false 并且启用了架构级时间戳,则跳过此更新的时间戳。请注意,这允许您覆盖时间戳。如果未设置架构级时间戳,则不执行任何操作。
小智 5
在浏览了 Mongoose 文档后,似乎简短的答案是否定的,如果没有设置findOneAndUpdate()该字段,就无法调用。如果您查看此处的updatedAt文档,它会明确指出所有用于更新的函数(findOneAndUpdate()、update() 和bulkWrite())都将运算符添加到要设置的查询中。话虽这么说,你确实有另一种选择,我强烈推荐。$setupdatedAt
解决方法
将createdAt和updatedAt字段直接添加到模型中,并去掉时间戳。当然,Mongoose 为您处理它确实很好,但最终,如果您必须尝试更改特定用例的时间戳设置功能,那么最好自己完成。
.save()如果您喜欢在调用或时设置updatedAt 和createdAt .update(),您可以随时编写自己的中间件来添加操作。
ProfileSchema.pre('save', function(next) {
this.createdAt = Date.now();
this.updatedAt = Date.now();
next();
});
Run Code Online (Sandbox Code Playgroud)
我知道这不是理想的解决方案,但坦率地说,我发现它更有用,因为它具有更大的控制权,并且猫鼬的意外行为更少。您对自己的代码的控制越多越好。希望这可以帮助!
| 归档时间: |
|
| 查看次数: |
434 次 |
| 最近记录: |