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

Mongoose三层嵌套Schema默认值未存入MongoDB原因咨询

问题原因分析

你遇到的问题核心在于:虽然你给嵌套Schema内部的字段设置了default,但外层的嵌套字段本身没有配置默认值来触发嵌套对象的创建。Mongoose不会自动为未指定的嵌套字段生成对应的Schema实例,所以内部的默认值自然没有机会被应用。

简单来说:你定义了contactDetails的类型是contact Schema,但当你不传入这个字段时,Mongoose会认为这个字段不存在,不会主动帮你创建一个空的contact对象,那里面的phoneNumber默认值也就无从谈起了。

解决方案:给嵌套字段添加默认值配置

要让嵌套Schema的默认值生效,你需要给每一层的嵌套字段设置default,让Mongoose在没有传入数据时自动生成对应的嵌套对象。推荐使用函数返回空对象的方式(避免多个文档共享同一个对象引用的潜在问题),具体修改如下:

const userContacts = new mongoose.Schema({ 
  user1PhoneNumber: { type: Number, default: 0 }, 
  user2PhoneNumber: { type: Number, default: 0 } 
})

const contact = new mongoose.Schema({ 
  phoneNumber: { type: Number, default: 0 }, 
  // 给contacts字段添加默认值,触发嵌套对象创建
  contacts: { type: userContacts, default: () => ({}) } 
})

const finalUserSchema = new mongoose.Schema({ 
  username: { type: String, required: true, max: 255 }, 
  email: { type: String, required: true, max: 255 }, 
  password: { type: String, required: true, min: 10, max: 1024 }, 
  // 给contactDetails字段添加默认值,触发嵌套对象创建
  contactDetails: { type: contact, default: () => ({}) } 
})

module.exports = mongoose.model('User', finalUserSchema);
测试验证

当你再执行创建用户的代码:

const user = new User({ 
  username: req.body.username, 
  email: req.body.email, 
  password: hashedPassword, 
});
await user.save();

此时数据库中的User文档会自动生成包含默认值的嵌套结构:

{
  "username": "xxx",
  "email": "xxx@example.com",
  "password": "xxx",
  "contactDetails": {
    "phoneNumber": 0,
    "contacts": {
      "user1PhoneNumber": 0,
      "user2PhoneNumber": 0
    }
  }
}

内容的提问来源于stack exchange,提问作者Nat

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.08 23:47:33