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

MongoDB数据不一致:添加评论至集合数组后数据库未更新

问题分析与解决方案

嗨,我一眼就发现问题所在啦!你已经成功把评论对象加到内存里的campground文档数组中了,但忘了把这个变更保存回MongoDB数据库——这就是为什么console.log能看到数组更新,但数据库里的comments还是空的原因!

问题根源

Mongoose返回的文档对象(比如这里的campComm)是内存中的副本,你对它做的修改(比如push新评论)只会在内存中生效,不会自动同步到数据库。必须显式调用save()方法,才能把内存中的变更持久化到MongoDB里。

修正后的代码

我把你的代码补上关键的保存步骤,同时完善了错误处理:

app.post('/campgrounds/:id/comments', function(req, res){
  Camp.findById(req.params.id, function(err, campComm){
    if(err){
      console.log(err);
      res.redirect('/campgrounds');
    } else {
      Comment.create(req.body.comment, function(err, comm){
        if(err){
          console.log(err);
        } else {
          campComm.comments.push(comm);
          // 核心步骤:调用save方法将变更同步到数据库
          campComm.save(function(err, updatedCamp){
            if(err){
              console.log(err);
            } else {
              console.log("数据库已更新:", updatedCamp);
              res.redirect('/campgrounds/' + req.params.id); // 跳转到营地详情页
            }
          });
        }
      });
    }
  });
});

进阶优化:用async/await简化代码

嵌套回调看起来有点杂乱,如果你用ES6的async/await写法,代码会更清晰易读:

app.post('/campgrounds/:id/comments', async function(req, res){
  try {
    // 1. 找到目标营地
    const campComm = await Camp.findById(req.params.id);
    // 2. 创建新评论
    const comm = await Comment.create(req.body.comment);
    // 3. 添加评论到数组并保存到数据库
    campComm.comments.push(comm);
    await campComm.save();
    // 4. 跳转回营地详情页
    res.redirect('/campgrounds/' + req.params.id);
  } catch(err) {
    console.log(err);
    res.redirect('/campgrounds');
  }
});

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.22 08:45:29