Mongoose有isDirty检查吗?

4

我有一个mongoose设置,其中包含一个嵌入式模式,比如:一个带有嵌入式评论的博客文章。评论可以由原始发布者以及编辑/管理员进行编辑。在添加/编辑评论后,整篇博客文章都会被保存。

我在嵌入式评论模式上设置了一些自定义的mongoose“pre”中间件,它会自动为该特定评论设置lasteditdate。

问题在于,“pre”在博客文章上的每个评论上都调用,因为我在博客文章上调用save()。(出于其他原因,我需要这样做)。因此,我需要一种方法来检查哪些评论自上次保存(作为Blogpost整体保存的一部分)以来已更改(或是新的)。

问题是:如何在“pre”中检查评论是否已更改?显然,调用this.isNew并不足够,因为评论也可以被编辑(即不是新的)。

我是否忽略了任何isDirty或类似的东西?

4个回答

18

对于 3.x 版本

if(doc.isModified()){
  // do stuff
}

9
在Mongoose中,您可以使用Document方法isModified(@STRING)
有关该方法的最新文档可以在这里找到。
因此,要使用doc.isModified检查特定属性,您可以执行以下操作:
doc.comments[4].message = "Hi, I've made an edit to my post";
// inside pre hook
if ( this.isModified('comments') ) {
  // do something
}

如果您想要检查特定评论,可以使用以下记号:this.isModified('comments.0.message') 由于参数采用字符串,如果您需要知道哪个评论被修改,您可以循环遍历每个评论并运行this.isModified('comments['+i+']message')

4
您可以使用修改后的getter方法:
if (doc.modified) {
   // :)
}

0

这可能与2020年中期使用Mongoose的用户有关,他们看到了这个错误:

    "errorType": "TypeError",
    "errorMessage": "Cannot set property 'isDirty' of null",

升级到最新版本的Mongoose以修复它。

https://github.com/Automattic/mongoose/issues/8719


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接