Mongoose向数组添加子文档报错:Cannot read properties of undefined
解决Mongoose向数组添加子文档时的TypeError问题
问题场景
按照Mongoose官方文档《Adding Subdocs to Arrays》的操作,在用户Schema的数组字段中添加子文档时,执行user.notebooks.push(newNotebook)抛出错误:
TypeError: Cannot read properties of undefined (reading 'push')
初始代码如下:
const User = require('../models/userModel') const addNotebook = async (req, res) => { ... const user = User.findOne({ userId }) const newNotebook = { userId: userId, notebookId: notebookId, title: title, numNotes: 0 } user.notebooks.push(newNotebook) }
修复方案
修复后的代码如下:
const User = require('../models/userModel') const addNotebook = async (req, res) => { ... const user = await User.findOne({ userId }) if (!user) return const newNotebook = { userId: userId, notebookId: notebookId, title: title, numNotes: 0 } // 确保notebooks数组存在,未初始化则设为空数组 user.notebooks = user.notebooks || []; user.notebooks.push(newNotebook) // 持久化修改到数据库 await user.save() }
关键修复点说明
- 给
User.findOne()添加await,获取实际的Mongoose文档实例(原代码中user是Promise对象,无法直接访问notebooks属性) - 增加
!user判断,避免未找到用户时继续执行后续逻辑 - 用
user.notebooks = user.notebooks || []确保数组存在,防止因字段未初始化导致的undefined报错 - 调用
await user.save()将修改后的文档保存到数据库
额外注意事项
MongoDB单文档有16MB的大小限制,若在子文档数组中无限嵌套数据,不仅容易触发大小限制,查询效率也会低于分集合存储的方式,使用子文档数组时需谨慎评估业务场景。
感谢Mandeep提供的!user判断和.save()方法建议,以及Sardar提出的数组初始化方案。
内容的提问来源于stack exchange,提问作者Francesco Russo
相关产品推荐
相关产品推荐

