Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/34.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 findOneAndUpdate中的更新日期更改_Node.js_Mongoose - Fatal编程技术网

Node.js 防止Mongoose findOneAndUpdate中的更新日期更改

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时间戳是用预钩子实

我已更新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时间戳,我手动维护它。自动最后更新的时间戳非常有用。我不建议扔掉它。复制自: