mongodb Mongoose不使用.保存()函数保存嵌套数组/深层对象

7kjnsjlb  于 2022-11-03  发布在  Go
关注(0)|答案(2)|浏览(143)

我有一个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(我想,“好吧,我实际上是在发布一个新的数组”)--但是没有成功。

y1aodyip

y1aodyip1#

你可能需要明确地指定你所做的改变或者你改变了哪个属性。当保存嵌套的或者深层的对象属性时,mongoose的处理方式有点令人惊讶。下面是mongoose网站上的文档:请在此处查看
在您的情况下,您可能需要执行额外的步骤,即指定要修改的属性/路径,如下所示:

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

nr7wwzry2#

对我来说,这是mongoose/mongodb奇怪地不存储该对象的情况

{
   name: { ar: 'بيلاروس', en: 'Belarus' },
   _id: new ObjectId("62af094497597de6050e3af2"),
   alpha2: 'by',
   phoneCode: '+375'
}

所以我尝试使用JSON parse/stringify将其转换为如下形式:

{
  name: { ar: 'بيلاروس', en: 'Belarus' },
  _id: '62af094497597de6050e3af2',
  alpha2: 'by',
  phoneCode: '+375'
}

使用JSON函数

let parsed = JSON.parse(JSON.stringify(data))

相关问题