MongoDB $push操作仅生成新_id,无法更新Lowongan数组求助
问题排查与解决方案
1. 检查嵌套Schema定义
确保company_postSchema字段配置正确,且在employerSchema的lowongan数组中正确引用。若不需要自动生成的_id,可显式关闭,避免空文档仅生成_id:
// company_postSchema 示例 const company_postSchema = new mongoose.Schema({ title: { type: String, required: true }, description: { type: String, required: true }, salary: Number // 其他业务字段 }, { _id: false }); // 关闭自动生成_id,防止空文档仅存_id // employerSchema 示例 const employerSchema = new mongoose.Schema({ companyName: String, lowongan: [company_postSchema] // 正确关联嵌套Schema });
若需保留_id,必须确保推送数据包含Schema中定义的必填字段,否则mongoose会创建仅含_id的空文档。
2. 修正PATCH请求的更新逻辑
确认mongoose更新语法正确,尤其是$push的结构,同时开启字段验证:
// 错误示例:未正确传递嵌套字段或未开启验证 router.patch('/employers/:id', async (req, res) => { try { const employer = await Employer.findByIdAndUpdate( req.params.id, { $push: { lowongan: req.body } }, // 若req.body未对应嵌套结构,会生成空文档 { new: true } // 缺少runValidators,跳过Schema验证 ); res.json(employer); } catch (err) { res.status(400).json({ error: err.message }); } }); // 正确示例:匹配嵌套结构并开启验证 router.patch('/employers/:id', async (req, res) => { try { // 假设请求体格式:{ "lowongan": { "title": "后端开发", "description": "熟悉Node.js", "salary": 10000 } } const newLowongan = req.body.lowongan; const employer = await Employer.findByIdAndUpdate( req.params.id, { $push: { lowongan: newLowongan } }, { new: true, runValidators: true } // 开启验证,确保字段符合Schema要求 ); res.json(employer); } catch (err) { console.error('更新错误:', err); // 打印详细错误信息 res.status(400).json({ error: err.message }); } });
关键:必须添加runValidators: true,否则mongoose会跳过嵌套Schema的必填字段验证,即使数据缺失也会生成空文档。
3. 确认请求体解析正常
若使用Express框架,需确保已添加express.json()中间件,否则无法解析JSON格式的请求体,导致req.body为空对象:
const express = require('express'); const app = express(); // 必须添加该中间件,否则无法接收JSON请求数据 app.use(express.json());
4. 检查请求数据与Schema字段匹配度
确认请求中的字段名和company_postSchema完全一致(包括大小写、拼写)。比如Schema定义为title,请求里写成Title会导致字段不被识别,最终生成仅含_id的空文档。可在接口中打印请求数据排查:
router.patch('/employers/:id', async (req, res) => { console.log('接收的招聘数据:', req.body.lowongan); // 检查数据结构是否正确 // 后续更新逻辑 });
内容的提问来源于stack exchange,提问作者adityamms
相关产品推荐
相关产品推荐

