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

MongoDB文档readBook数组数据推送失败,请求技术支持

排查MongoDB User集合readBook数组推送无变化的问题

从你的代码和日志来看,确实已经成功获取到了用户数据和请求体,但数据没更新且无报错,主要有两个核心问题,咱们一个个解决:

1. 异步操作未正确处理

你用的User.update()是异步方法,但代码里没有等待它执行完成,也没有处理回调/Promise,这会导致操作可能还没和数据库交互,请求就已经结束了,而且就算有错误也不会被捕获。

另外,Mongoose的update()方法在新版本里已经被标记为废弃,更推荐用updateOne()或者findByIdAndUpdate()这类更明确的方法。

2. 请求体字段与Schema不匹配

看你的console.log,req.body里的评分字段是bookRating,但你的UserSchema中readBook数组的评分字段是rating,字段名不匹配的话,就算推送成功,数据也不会按照你预期的结构存入readBook数组里。

修正后的代码示例

方式一:使用回调处理异步

router.post("/ratebook", (req,res,next) => {
  User.findById(1)
    .exec( (error, user) => {
      if(error) {
        return next(error);
      } else {
        console.log(user);
        console.log(req.body);
        // 映射字段,把请求里的bookRating转成Schema要求的rating
        const bookData = {
          id: req.body.id,
          status: "completed", // 可根据业务需求设置默认值或从请求体获取
          rating: req.body.bookRating
        };
        // 使用updateOne并处理回调,捕获更新时的错误
        User.updateOne(
          { _id: 1},
          { $push: {"readBook": bookData}},
          (updateError, result) => {
            if(updateError) {
              return next(updateError);
            }
            res.status(200).json({message: "书籍评分已添加", result});
          }
        );
      }
    })
})

方式二:使用async/await(更简洁易读)

router.post("/ratebook", async (req,res,next) => {
  try {
    const user = await User.findById(1).exec();
    if(!user) {
      return res.status(404).json({message: "未找到用户"});
    }
    console.log(user);
    console.log(req.body);
    const bookData = {
      id: req.body.id,
      status: "completed", // 根据业务场景调整
      rating: req.body.bookRating
    };
    const result = await User.updateOne(
      { _id: 1},
      { $push: {"readBook": bookData}}
    );
    res.status(200).json({message: "书籍评分已添加", result});
  } catch(error) {
    next(error);
  }
})

额外优化建议

  • 可以给readBook的字段设置合理默认值,比如status默认设为"reading",避免存入空值;
  • 操作数据库时尽量用try/catch捕获所有可能的错误,方便排查问题;
  • 可以用findByIdAndUpdate()直接更新,不需要先查询用户,减少一次数据库请求:
const bookData = {
  id: req.body.id,
  status: "completed",
  rating: req.body.bookRating
};
const updatedUser = await User.findByIdAndUpdate(
  1,
  { $push: { readBook: bookData }},
  { new: true } // 返回更新后的用户数据
);

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.28 10:07:19