MERN栈使用Mongoose如何更新Movies集合中嵌套数组内的多个对象?
Mongoose更新嵌套数组座位状态解决方案
方法1:基于现有查询逻辑修改后保存(适配你当前代码)
你已经可以定位到目标座位对象,直接修改属性后调用Mongoose文档的save()方法即可提交更新,修改后的代码如下:
app.post('/confirm/:movieId/:timeId', (req, res) => { const movieId = req.params.movieId; const timeId = req.params.timeId; const selectedSeats = req.body; const length_timeId = timeId.length; Movies.findOne({ movieId }, (err, movie) => { if(err) return res.status(500).send("查询电影信息失败"); const getTimeSlots = movie['timeslots']; const index = timeId.substring(1, length_timeId); const getSeats = getTimeSlots[parseInt(index)-1]; // 遍历修改选中座位的预订状态 for(var i=0; i<selectedSeats.length; i++) { let row = parseInt(selectedSeats[i] / 5); let id = selectedSeats[i] % 5; // 直接修改属性值 getSeats["seats"][row][id].isReserved = true; } // 提交修改到数据库 movie.save((saveErr, updatedMovie) => { if(saveErr) return res.status(500).send("座位状态更新失败"); res.status(200).send("预订成功"); }) }) })
方法2:直接执行更新语句(性能更优)
无需先查询文档,直接构造更新规则操作数据库,减少一次查询开销:
app.post('/confirm/:movieId/:timeId', (req, res) => { const movieId = req.params.movieId; const timeId = req.params.timeId; const selectedSeats = req.body; const slotIndex = parseInt(timeId.substring(1, timeId.length)) - 1; const updateRules = {}; // 构造所有需要更新的字段规则 for(let i=0; i<selectedSeats.length; i++) { const row = parseInt(selectedSeats[i] / 5); const seatId = selectedSeats[i] % 5; updateRules[`timeslots.${slotIndex}.seats.${row}.${seatId}.isReserved`] = true; } // 直接执行更新操作 Movies.updateOne( { movieId }, { $set: updateRules }, (err, result) => { if(err) return res.status(500).send("座位状态更新失败"); res.status(200).send("预订成功"); } ) })
注意事项
- 并发预订场景下建议增加乐观锁或者事务逻辑,避免同一座位被重复预订
- 入参建议增加合法性校验,避免传入非法的座位编号导致报错
内容的提问来源于stack exchange,提问作者CoderNewbie
相关产品推荐
相关产品推荐

