首页 > 解决方案 > 猫鼬中的 isModified() - v5

问题描述

我正在使用isModified文档上的 () 来执行某些逻辑。false但是即使在指定的字段发生更改后,该方法似乎也会返回。

代码片段:

exports.updateUser = async (req, res, next) => {
    const userId = req.params.id
    
    const tmpUser = await userModel.findById(userId)
    console.log(`User email before update - ${tmpUser.email}`)

    const user = await userModel.findByIdAndUpdate(userId, {email: req.body.email}, { new: true })
    
    console.log(`User email after update - ${user.email}`)
    console.log(`Is Modified - ${user.isModified('email')}`)
   
    res.status(200).json({
        user
    })
}

安慰:

User email before update - Test1@gmail.com
User email after update - Test12@gmail.com
Is Modified - false

文档的电子邮件字段在数据库中已更改,但 isModified() 返回 false。

还建议我是否可以为此更新操作使用挂钩或中间件。我已经尝试了 pre 钩子,'updateOne'但它不起作用。

标签: mongodbmongoose

解决方案


findByIdAndUpdate()不会触发钩子,因此isModified返回 false(关于触发器的来源:https ://mongoosejs.com/docs/middleware.html#notes )。

但是,您可以使用稍微不同的方法 ( updateOne),它会起作用(并提供与您的相同的功能):

const user = await userModel.updateOne({ _id: Types.ObjectId(userId ) }, { email: req.body.email });

要检查电子邮件是否已更新,请使用:result.nModified。这将返回 1 或 0(0 表示未修改)。


推荐阅读