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

如何向MongoDB数组中添加数据?现有代码无法写入数据库求正确实现方法

问题根因

你当前代码仅修改了从数据库查询到、存储在运行内存中的restaurant普通对象的reviews数组,没有执行任何将修改同步回数据库的持久化操作,因此改动不会写入数据库。

正确实现方式

推荐优先使用MongoDB原子操作符$push完成更新,不需要先查询文档再修改,性能更高且能避免并发修改冲突:

async created (restaurantId, title, reviewer, rating, dateOfReview, review) {
  const restaurantsCollection = await restaurants();
  // 构造新评论对象
  const newReview = {
    restaurantId,
    title,
    reviewer,
    rating,
    dateOfReview,
    review
  };
  // 直接执行数据库更新操作,用$push向reviews数组追加元素
  const updateResult = await restaurantsCollection.updateOne(
    { _id: restaurantId }, // 匹配指定餐厅的查询条件
    { $push: { reviews: newReview } } // 执行数组追加操作
  );
  // 可选:判断是否匹配到文档,处理餐厅不存在的场景
  if (updateResult.matchedCount === 0) {
    throw new Error("指定ID的餐厅不存在");
  }
  return newReview;
}

如果你确实需要先查询餐厅文档做其他逻辑校验,再添加评论,修改完内存对象后需要调用updateOne()方法把改动写回数据库:

async created (restaurantId, title, reviewer, rating, dateOfReview, review) {
  const restaurantsCollection = await restaurants();
  const newReview = {
    restaurantId,
    title,
    reviewer,
    rating,
    dateOfReview,
    review
  };
  // 查询对应餐厅文档
  const restaurant = await restaurantsCollection.findOne({ _id: restaurantId });
  if (!restaurant) {
    throw new Error("指定ID的餐厅不存在");
  }
  // 内存中修改reviews数组
  restaurant.reviews.push(newReview);
  // 把修改后的数组写回数据库
  await restaurantsCollection.updateOne(
    { _id: restaurantId },
    { $set: { reviews: restaurant.reviews } }
  );
  return newReview;
}
注意事项
  • 操作前一定要判断查询到的餐厅是否存在,避免空对象调用push方法报错
  • 优先选择第一种原子操作方案,不需要传输全量文档,也能避免多个请求同时修改reviews数组出现的覆盖问题

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.29 11:24:03