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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.11 04:53:12