我有一个涉及嵌入式架构的猫鼬设置,比方说:一个带有嵌入式注释的Blogpost。评论可以由原始出版商以及编辑/管理员进行编辑。添加/编辑评论后,将保存整个博客帖子。
我在嵌入式评论模式上设置了一些自定义mongoose的“预先”中间件,它自动设置该特定评论的持续时间。
事实上,在博客帖子上的每条评论都会调用'pre',因为我在blogpost上调用了save()。 (出于其他原因,我需要像这样做)。因此,我需要一种方法来检查哪些注释已经更改(或者是新的),因为它们最后一次保存(作为Blogpost整体保存()的一部分)
问题:如何检查“预先”评论是否发生了变化?显然,调用this.isNew
是不够的,因为评论也可以编辑(即:不是新的)。
我有没有isDirty
或类似的东西?
答案 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进行修复。