【问题标题】:does mongoose have an isDirty check?猫鼬有 isDirty 检查吗?
【发布时间】:2020-06-05 23:25:55
【问题描述】:

我有一个涉及嵌入式模式的猫鼬设置,可以说:带有嵌入式 cmets 的博客帖子。评论可以由原始发布者以及编辑/管理员编辑。添加/编辑评论后,将保存整个博文。

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

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

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

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

【问题讨论】:

    标签: node.js mongoose


    【解决方案1】:

    对于版本 3.x

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

    【讨论】:

      【解决方案2】:

      在 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')

      【讨论】:

        【解决方案3】:

        你可以使用修改后的getter:

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

        【讨论】:

          【解决方案4】:

          这可能与大约 2020 年中期看到此错误的 Mongoose 用户有关:

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

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

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

          【讨论】:

            猜你喜欢
            • 2020-06-29
            • 2019-10-17
            • 2020-06-02
            • 2012-02-03
            • 1970-01-01
            • 1970-01-01
            • 2016-09-11
            • 1970-01-01
            • 2012-06-05
            相关资源
            最近更新 更多