猫鼬有没有isDirty检查?

时间:2012-05-07 19:12:50

标签: node.js mongoose

我有一个涉及嵌入式架构的猫鼬设置,比方说:一个带有嵌入式注释的Blogpost。评论可以由原始出版商以及编辑/管理员进行编辑。添加/编辑评论后,将保存整个博客帖子。

我在嵌入式评论模式上设置了一些自定义mongoose的“预先”中间件,它自动设置该特定评论的持续时间。

事实上,在博客帖子上的每条评论都会调用'pre',因为我在blogpost上调用了save()。 (出于其他原因,我需要像这样做)。因此,我需要一种方法来检查哪些注释已经更改(或者是新的),因为它们最后一次保存(作为Blogpost整体保存()的一部分)

问题:如何检查“预先”评论是否发生了变化?显然,调用this.isNew是不够的,因为评论也可以编辑(即:不是新的)。

我有没有isDirty或类似的东西?

4 个答案:

答案 0 :(得分:16)

对于版本3.x

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

答案 1 :(得分:7)

在Mongoose中,您可以使用Document方法isModified(@STRING)

可以找到该方法的最新文档here

因此,要使用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')

答案 2 :(得分:3)

您可以使用修改过的getter:

if (doc.modified) {
   // :)
}

答案 3 :(得分:0)

这可能与2020年中左右出现此错误的Mongoose用户有关:

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

升级到最新版本的Mongoose进行修复。

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