You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.05 13:50:17