Node.js 防止Mongoose findOneAndUpdate中的更新日期更改
我已更新Mongoose模型,然后使用实现简单视图计数器的Node.js 防止Mongoose findOneAndUpdate中的更新日期更改,node.js,mongoose,Node.js,Mongoose,我已更新Mongoose模型,然后使用实现简单视图计数器的$inc运算符检索: const profile = await Profile.findOneAndUpdate({ userName }, { $inc: { viewsCount: 1 } }); 配置文件模式启用了时间戳选项。问题是updatedAt在viewsunt更新期间被更新,这不是一个理想的行为 我想在更新viewsunt时禁用updatedAt更新,最好通过尽可能少的查询来实现 我假设Mongoose时间戳是用预钩子实
$inc
运算符检索:
const profile = await Profile.findOneAndUpdate({ userName }, { $inc: { viewsCount: 1 } });
配置文件
模式启用了时间戳
选项。问题是updatedAt
在viewsunt
更新期间被更新,这不是一个理想的行为
我想在更新viewsunt
时禁用updatedAt
更新,最好通过尽可能少的查询来实现
我假设Mongoose时间戳是用预钩子实现的
如果不更新updatedAt
,如何findOneAndUpdate
增量viewsCount
这可以通过否定时间戳钩子的效果来实现吗
有类似的问题可以解决
updatedAt
更新的问题,但解决方案并不适合这种情况。在浏览了Mongoose文档之后,简短的回答似乎是否定的,如果不设置updatedAt
字段,就无法调用findOneAndUpdate()
。如果查看文档,它会明确指出所有更新函数(findOneAndUpdate()、update()和bulkWrite())都会将$set
操作符添加到查询中,以设置updatedAt
。也就是说,你还有另一个选择,我强烈推荐
解决问题
将createdAt和updatedAt字段直接添加到模型中,并去掉时间戳。当然,Mongoose为您处理它真的很好,但最后,如果您必须尝试更改特定用例的时间戳的设置功能,最好自己做
如果您喜欢在调用.save()
或.update()
时设置updatedAt和createdAt,那么您可以编写自己的中间件来添加操作
ProfileSchema.pre('save', function(next) {
this.createdAt = Date.now();
this.updatedAt = Date.now();
next();
});
我知道这不是理想的解决方案,但坦率地说,我发现它更有用,因为它可以更好地控制猫鼬,减少猫鼬的意外行为。您对自己的代码控制得越多越好。希望这有帮助 最简单的解决方法是直接与MongoDB API对话,而不让Mongoose处理更改。此代码将实现以下功能:
const profile = await Profile.collection.findOneAndUpdate({ userName }, { $inc: { viewsCount: 1 } });
从开始,可以将第三个参数设置为{timestamps:false}
从:
[options.timestamps=null]«Boolean»如果设置为false并且启用了架构级时间戳,则跳过此更新的时间戳。请注意,这允许您覆盖时间戳。如果未设置架构级时间戳,则不执行任何操作
谢谢我希望有更干净的解决办法。时间戳的正确实现不会那么简单。我很可能会使用第三方时间戳插件。我维护了默认的时间戳:{createdAt:Date.now,updatedAt:'last_writed'}要知道我什么时候做管理工作,我想知道我的记录什么时候更新,然后我创建了一个额外的updatedAt时间戳,我手动维护它。自动最后更新的时间戳非常有用。我不建议扔掉它。复制自: