Mongoose无法保存Map类型数据 存储后仅显示_id无其他字段如何解决
问题根因
你遇到的保存为空问题有两个核心错误:
- 插入数据结构和Schema定义不匹配:
years字段是tempSchema类型的数组,每个数组元素必须符合{month: 你的Map数据}的结构,你直接往数组中push了month这个Map实例,结构完全不匹配,Mongoose会直接忽略不符合Schema的字段,因此最终保存的文档只有默认生成的_id。 - 未做异步错误捕获:你直接调用
save()没有使用await或者回调处理异步结果,即使保存过程中抛出了异常,你也会误以为操作成功。
解决方案
1. 修正插入数据的结构
调整向years数组添加元素的逻辑,和Schema结构对齐:
// 前面生成date、countries、month Map的代码保持不变 const newYear = new Years() // 不要直接push month实例,套一层符合tempSchema的结构 newYear.years.push({ month: month }) // 等待save操作完成,捕获可能的错误 try { await newYear.save() console.log('保存成功') } catch (err) { console.error('保存失败,错误信息:', err) }
如果是在非async函数中执行,可以用回调方式处理:
newYear.save((err, doc) => { if (err) console.error('保存失败', err) else console.log('保存成功', doc) })
2. 简化测试场景的对应修正
你之前的简化测试Schema,插入数据时需要直接给month字段赋值Map实例即可:
// 编译Model的示例 const TempModel = mongoose.model('Temp', tempSchema) const testDoc = new TempModel() const testMonth = new Map() testMonth.set('1', 100).set('2', 200) // 直接给month字段赋值Map testDoc.month = testMonth await testDoc.save()
额外注意事项
- 确保你已经用正确的Schema编译了Model,不要把Schema和Model搞混:
const Years = mongoose.model('Years', yearsSchema) - 可以给Map字段设置默认值,避免未赋值时出现异常:
month: { type: Map, of: Number, default: () => new Map() } - Mongoose 6及以上版本对嵌套Map的支持是稳定的,不存在嵌套层级过高无法保存的问题,只要结构符合Schema定义即可正常存储。
内容的提问来源于stack exchange,提问作者Abdul Kabeer
相关产品推荐
相关产品推荐

