如何向含嵌套对象的MongoDB Schema中插入用户数据
向Mongoose嵌套对象插入数据的解决方案
别着急,嵌套对象的插入其实是Mongoose里很常见的操作,我帮你梳理两种直接可行的解决方式,先提个小细节:你的Schema里有拼写错误,requred应该是required,修正后能避免不必要的验证错误哦。
方法一:创建User实例时直接传入完整嵌套对象
你可以在初始化new User的时候,把work和subscription直接构造成符合Schema结构的对象传入。比如从请求体获取字段后组装:
// 假设从req.body拿到所有表单数据 const { data, data2, industry, workName, position, product, license, price } = req.body; // 构造符合Schema的嵌套对象 const workInfo = { industry: industry, name: workName, // 这里用workName避免和变量名冲突,对应Schema里的name字段 position: position }; const subInfo = { product: product, license: license, price: price, // Schema里已经给status、renew设了默认值,这两个字段可以不传,Mongoose会自动填充 }; // 创建用户实例并保存 const newUser = new User({ data, data2, work: workInfo, subscription: subInfo }); newUser.save() .then(user => { req.flash('success_mg', 'Successfully Registered your can now Login.'); res.redirect('/login'); }) .catch(err => console.log(err));
如果前端提交的字段名和Schema嵌套字段完全匹配(比如前端传work[industry]或者直接industry),也可以直接简写:
const newUser = new User({ data: req.body.data, data2: req.body.data2, work: { industry: req.body.industry, name: req.body.name, position: req.body.position }, subscription: { product: req.body.product, license: req.body.license, price: req.body.price } });
方法二:先创建实例,再分步赋值嵌套属性
如果需要分步设置嵌套对象的属性,也可以先初始化空实例,再逐个赋值:
// 先初始化基础字段的实例 const newUser = new User({ data: req.body.data, data2: req.body.data2 }); // 给work嵌套对象赋值 newUser.work.industry = req.body.industry; newUser.work.name = req.body.name; newUser.work.position = req.body.position; // 给subscription赋值,默认字段可省略 newUser.subscription.product = req.body.product; newUser.subscription.license = req.body.license; newUser.subscription.price = req.body.price; // 最后保存 newUser.save() .then(user => { req.flash('success_mg', 'Successfully Registered your can now Login.'); res.redirect('/login'); }) .catch(err => console.log(err));
关键注意点
- 确保嵌套对象的字段名和Schema定义完全一致,别写错变量名(比如Schema里是
work.name,就别写成work.companyName)。 - 如果嵌套字段没设
required,可以选择性传入;有default的字段不传的话,Mongoose会自动用默认值填充(比如subscription.status默认是false)。 - 保存时报错的话,直接打印
err看具体验证信息,大概率是漏传必填字段或者字段类型不匹配。
内容的提问来源于stack exchange,提问作者mommy002
相关产品推荐
相关产品推荐

