如何向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
相关产品推荐
相关产品推荐

