node.js - 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(想,'好吧,我实际上是在发布一个新数组')——但这没有用。
解决方案
您可能需要明确指定更改或更改的属性。使用嵌套或深层对象属性保存时,mongoose 的处理方式有点令人惊讶。这是猫鼬网站上的文档:检查这里
在您的情况下,您可能需要做一个额外的步骤,即指定要修改的属性/路径,例如:
user.markModified('habits')
await user.save()
推荐阅读
- javascript - RegExp / JavaScript:在多个字符上拆分字符串,保留分隔符而不使用lookbehind
- graphql - NESTJS + GraphQL Last Imported 模块覆盖以前的 schema.gql
- postgresql - 如何将地图 [字符串] 插入 jsonb 字段
- python - Kfold 如何在 tensorflow 中与管道交叉验证?
- java - 如何优化批量上传用户 Azure B2C JAVA?
- excel - EXCEL 需要为每个范围提供不同的答案,多个范围
- svelte - SvelteKit - .ts 和 .js 的热重载不起作用
- javascript - 如何使 Modal 仅在当前屏幕上弹出并且每天响应一次?
- acumatica - Acumatica 采购收据更新错误:序列不包含匹配元素
- linux - 无法设置 MoKListXRT:资源不足无法创建 MoKListXR:资源不足