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

使用Express.js和Mongoose向MongoDB数组推送对象时字段丢失求助

问题解决思路

核心原因:Mongoose Schema定义不完整

你遇到的问题是因为Course模型的Schema中,dates数组的子文档没有定义description字段(或其他你要添加的字段)。Mongoose默认开启严格模式,会自动过滤Schema中未定义的字段,导致只有Schema里存在的date字段被存入数组,其他字段被忽略。

解决步骤

1. 检查并修正Course的Schema定义

确保你的Course Schema中,dates数组的子文档包含所有需要的字段。示例如下:

const mongoose = require('mongoose');

const courseSchema = new mongoose.Schema({
  // 其他课程字段(比如name、teacher等)
  dates: [
    {
      description: { type: String, required: true }, // 明确定义description字段
      date: { type: Date, required: true } // 保持date字段定义
      // 若需要其他字段,在此处添加
    }
  ]
});

module.exports = mongoose.model('Course', courseSchema);

2. 验证请求参数是否正确传递

取消注释代码中的console.log,确认req.body.description、req.body.date、req.body.courseId都有正确的值:

console.log(req.body.description, req.body.date, req.body.courseId);

3. 优化更新操作的返回结果(可选但推荐)

默认情况下findOneAndUpdate返回的是更新前的文档,如果想直接看到更新后的结果,需要添加{ new: true }选项,同时记得添加错误捕获:

router.post("/addDate", (req, res, next) => {
  console.log(req.body.description, req.body.date, req.body.courseId);
  Course.findOneAndUpdate(
    { _id: req.body.courseId },
    { $push: { dates: { description: req.body.description, date: req.body.date } } },
    { new: true } // 返回更新后的文档
  )
  .then(respData => {
    res.status(200).json({ message: respData });
  })
  .catch(err => {
    res.status(500).json({ error: err.message });
  });
});

额外提示

  • 不要随意关闭Mongoose的严格模式(strict: false),这会失去字段校验的能力,增加数据异常的风险。
  • 如果字段名需要修改,务必同步更新Schema中的定义,否则新字段依然会被过滤。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.22 12:50:14