首页 > 解决方案 > Mongoose 不使用 .save() 函数保存嵌套数组/深层对象

问题描述

我有一个 MongoDB,我正在使用 Mongoose API。

我有一个方法,我希望它能让我在我的用户对象中找到一个“习惯”。习惯是生活在一系列习惯中的对象。我正在向该方法传递一个 UUID 以找到该习惯。

这是我的方法:

async updateHabit(req, res) {
    const { user_id } = req.headers
    const { habitId  } = req.params
    const habit = req.body
    
    const user = await User.findById(user_id)
  
    const habitIndex = user.habits.findIndex(habit => habit.id == habitId)

    user.habits[habitIndex] = habit

    console.log(user.habits)

    await user.save()

    return res.json(user.habits)
  }

奇怪的是保存方法正上方的控制台日志,它显示了我的用户的最新版本,显示正确。它将用户的习惯与旧习惯的更新习惯一起记录在旧习惯所在的索引处。

但是,保存方法不会将其写入我的数据库。我有一个几乎相同的删除方法,它工作得很好。

我曾尝试从 PUT 更改为 POST(想,'好吧,我实际上是在发布一个新数组')——但这没有用。

标签: node.jsmongodbmongoose

解决方案


您可能需要明确指定更改或更改的属性。使用嵌套或深层对象属性保存时,mongoose 的处理方式有点令人惊讶。这是猫鼬网站上的文档:检查这里

在您的情况下,您可能需要做一个额外的步骤,即指定要修改的属性/路径,例如:

user.markModified('habits')
await user.save()

推荐阅读