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
相关产品推荐
相关产品推荐

